ふらっと C#,C♯,C#(初心者用) Part149

■ このスレッドは過去ログ倉庫に格納されています
2020/12/16(水) 11:29:35.35ID:TSvQ057dM
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part148
https://mevius.5ch.net/test/read.cgi/tech/1590578921/
■関連スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/02/14(日) 20:53:10.91ID:K2VDjDyL0
Ruby on Rails で、控えめなJS フレームワークの、Stimulu を使えば良い

規約で、HTML のdata-controller 属性で、JSファイル名・コントローラーが決まるので、
そこにイベント処理を書くだけ

DOM・コントローラーは、多対多

1つのDOMは、複数のコントローラーで処理できる。
HTML内で、同じコントローラーを複数定義できる
2021/02/14(日) 21:14:32.55ID:RwzQEShB0
>>664
引用してる文と質問内容が全然別物に見えるので回答できん
とりあえずINotifyPropertyChangedでのBindingならPropertyChangedは別スレッドで発生させても問題ない
2021/02/14(日) 21:22:32.21ID:EcQCs95s0
>>664
そのレスはTask使ってるのに一々同期的に取り出してそうに見えて
固まらせたくない箇所を非同期にすれば良い的な意味合いで質問と噛み合うかどうか

そのプロパティを変更するのがUIコントロールでスレッドが異なれば必要…なんだけど
TaskをConfigureAwait(false)してなければawaitは待機元スレッドに帰ってくるよ

BeginInvokeはTaskベースで使うかな?別スレッドから実行させるならProgress<T>とか
4.5未満としてもSynchronizationContext.PostやTaskSchedulerを指定してContinueWithかな
2021/02/15(月) 08:14:10.72ID:rMuvZP7r0
surfaceやipadなどで使えるクロスプラットフォームの、ペイントアプリを作ってみたいのですが、
C#が採用されているペイントソフトや3DCGソフトで有名なのってありますか?
2021/02/15(月) 08:52:18.66ID:URqj7Tc+0
>>670
Paint.NET
2021/02/15(月) 08:53:55.45ID:efsWz5OT0
>>670
Paint.NET
2021/02/15(月) 09:34:24.49ID:D0ANu2Du0
>>670
https://www.pinta-project.com/

なお paint.netのソースはwin32Api 知ってないと
キツいぞ。
projectはformだがwindow周りの実装は
ほぼwin32apiだ
2021/02/15(月) 11:14:53.43ID:r1R8Fv3d0
int port;
に対して
if( port < 1 && 65535 < port )
みたいなtrueになりえない条件文ってコンパイル時の警告出せないんでしたっけ?
2021/02/15(月) 15:06:53.89ID:Hxbo2jbM0
>>668,669
質問が下手ですみません。質問を変えます

private async void Button_Click(object sender, RoutedEventArgs e)
{
Button.IsEnabled = false;
await Task.Delay(2000);
Button.IsEnabled = true; // *1
}
タスクが完了したときにUIスレッドが作業中だったとします。
そうすると、UIスレッドは作業を中断して *1を呼びますよね。
この解釈で正しいですか ?

だとすると、Buttonに対して
Button.IsEnabled += Button_IsEnabled がある場合、
UIスレッドが作業中だとUIスレッドは混乱するのではないかと思っています。

混乱を解消するには、awaitの後処理にはUIスレッドが暇になるのを待つ必要があるのではと考え、Dispatchr.BeginInvokeを思いつきました。
ただし、BeginInvokeを追加した例が見当たらないので、もっとうまい手があるのかもしれないと思い、質問しました。

長文失礼
2021/02/15(月) 15:24:35.05ID:89MhGAsi0
実際の実装は知らんがWindowsのメッセージループを処理するスレッドがUIスレッド(メインスレッド)だろうから、その手のスレッドプールで処理されるものは処理が終わった時点でメインスレッドにメッセージをポストしてメインスレッドがメッセージを受信したときに終了後の処理がされると言う流れかと
2021/02/15(月) 16:12:35.84ID:CfDXxyFV0
>>675
TaskとThreadを混同してるってオチ?
君が懸念してることは別Threadを利用したときに起こる事であって、DispatcherInvoke類も"別Thread"からUI操作を行うときに使う機能
2021/02/15(月) 17:54:07.29ID:ytBU07x20
>>675
作業を中断して*1を呼ぶというのは不適切に感じます。中断というならButton_Clickがawaitで後続処理が保留になる所でしょうか
そうなると*1が再開される手順ですが、UI処理はメッセージ単位なので>>676が仰る様なその合間に完了を感知してになると思います
このメッセージキューがパフォーマンスや互換性問題から専用スレッドによる処理が前提なのでBeginInvokeなどが必要になる訳です

翻ってawaitを使うとその辺りをやってくれます。FormsやWPFで異なる手順を抽象化したものがSynchronizationContextやTaskSchedulerですが
それらを推し進めて簡便に扱えるようにしたのがasync/awaitです。※同期的待機内で非同期待機とかしなければそんなに留意する必要はありません

技術的な解説については↓等が参考になると思いますが、直下のコードについてはTaskベース世代のものではないですね
https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/advanced/threading-model?view=netframeworkdesktop-4.8
2021/02/15(月) 19:20:24.59ID:Hxbo2jbM0
>>677,678
私の例で *1のプロパティ変更と通知ではメッセージループを使っているのかもしれませんが、*1の呼び出しは awaitの後続処理ではないでしょうか

次の例はまずいのではないでしょうか。
private async void Button_Click(object sender, RoutedEventArgs e)
{
await Task.Delay(2000);
MyCLREvent(this, EventArgs.Empty);
}
2021/02/16(火) 00:47:37.27ID:yRjou++30
なにをしてまずいというのかはわからんが
各所でThread.CurrentThread.ManagedThreadId表示させて
どこでどのスレッドになってるか確認してみれば?
2021/02/16(火) 01:07:19.33ID:fNU3Qny80
>>679
*1はawaitの後続処理だけど、UIスレッドが空くまで実行されない
2021/02/16(火) 09:52:46.68ID:ZNVxOhBd0
ボタン2つ用意してこういうので確認してみては
async void btn1_Click(object sender, RoutedEventArgs e) {
await Task.Delay(2000);
Trace.WriteLine("btn1");
}
void btn2_Click(object sender, RoutedEventArgs e) {
for (int i = 0; i < 10; i++) {
Thread.Sleep(300);
Trace.WriteLine("btn2");
}
}
2021/02/16(火) 22:48:01.66ID:/yXZfRwG0
csvで数字を読み込んで、それをグラフ化して表示して、GUIの画面ごとスクリーンショットして保存するWPFプログラムを作ってます。
グラフはwindowsformhostを使ってchartコントロールで表示させています。

VisualTreeHelperでGUIの縦横サイズを取得して、RenderTargetBitmapにDrawingVisualを渡してスクリーンショットしているのですが、chart部分が保存されません
Graphics.CopyFromScreenというのも試してみましたがこちらではchartも表示されるものの、ウィンドウのドロップシャドウみたいなものが一緒に保存されてその分縦横がズレてGUIの右下が見切れます。
解決策を教えてください
2021/02/16(火) 22:58:23.73ID:92chE2An0
allowtransparencyがtrueになってるとか?
2021/02/17(水) 03:55:15.13ID:eRzk3aeWa
>>683
違ったらごめん
これじゃダメなの?
http://mevius.5ch.net/test/read.cgi/tech/1527325729/533-534
686デフォルトの名無しさん (オッペケ Src7-adQg)
垢版 |
2021/02/17(水) 14:41:28.07ID:UPYA2zP2r
ディスプレイ上の座標を指定して、
画面の指定部分をそのままフォームに表示させたいと思っています
まずこれが可能なのかが資料見つかりませんでした
可能なら、毎回スクショ切り取って保存して表示、とかせずに、リアルタイムで反映させたいです

また、そのようにして表示した画面に、拡大や色反転などの加工を行うことは可能でしょうか?
2021/02/17(水) 15:11:52.55ID:JjIbIhY/0
この辺使ってどうにかなりそうかな
試してないけど
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.screen
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.graphics.copyfromscreen
2021/02/17(水) 16:27:46.54ID:VhEokLWI0
可能かどうかで言えばWindows標準の拡大鏡ツールで実現できてるから可能といえる
C#で実現するのにはまあまず687を試してみればいいんじゃないかな
あと著作権保護されてるコンテンツを表示してる部分は多分無理
2021/02/17(水) 21:03:31.28ID:D9ZFiUm80
PaintWindowで取れないかな
690デフォルトの名無しさん (ササクッテロ Spc7-Jyxv)
垢版 |
2021/02/17(水) 23:31:19.68ID:5a8siaYVp
リアルアイムでやるならWindows.Graphics.CaptureやDesktop Duplication APIだな
2021/02/17(水) 23:35:50.45ID:wHZs7f540
VSのProjectの構成って何仕様書で定義するものでしょうか?
外部仕様では見たこと無いのですが世間様はどうしてるんだろうと
2021/02/18(木) 00:11:30.22ID:c2uEmfa00
安心の俺様仕様
2021/02/18(木) 00:19:08.60ID:80X4NLoW0
一般的には詳細設計で各プロジェクトの構成定義する
2021/02/18(木) 08:41:32.49ID:K3tSL8mT0
世間様じゃ詳細設計で決めてるのですね
参考になります
外仕作成でプロジェクトの構造考えずプロトタイプもりもり作っていたので気になってました
2021/02/18(木) 09:18:08.93ID:fjuXbMGDa
んなもん設計書にはかかないよ
696デフォルトの名無しさん (ワッチョイ 96bb-9N8P)
垢版 |
2021/02/18(木) 09:27:17.33ID:jXEmO6nJ0
Swiftスレにも似たようなこと書いてる奴がいるから、きっとこのことをまとめてアフィブログにでもするんだろう
697デフォルトの名無しさん (ラクッペペ MMde-HHI4)
垢版 |
2021/02/18(木) 10:41:06.50ID:4sNPnSsIM
Debug.Printの引数はリリース版でも評価されますか?
2021/02/18(木) 12:42:01.95ID:DdhrYGF40
現実的にプロジェクトの構造なんて誰も気にしない
2021/02/18(木) 18:00:30.64ID:EVRbmhyV0
プロジェクトの構成なのか構造なのか
そもそも構成とか構造って具体的に何?
2021/02/18(木) 22:14:18.02ID:UlBwu06v0
Ruby on Rails は、設定よりも規約

プロジェクト構成・名前付けルールなど、すべて決まっているから、
誰でも、同じ構成で作る

これが「レールに乗る」と言う事。
Rails のルールから外れて、独自なものを作ってはならない

オレオレ構成みたいなものを認めていない
2021/02/19(金) 00:45:43.92ID:GwnD0oPh0
なんでRoRの話が突然出てくるのか
2021/02/19(金) 01:48:24.06ID:8tmtltZz0
>>701
他のスレ追い出されたやつだから
2021/02/19(金) 02:16:52.43ID:+BesUuNA0
定期的に沸くたびに丁寧に相手するから居着いたパターン
2021/02/19(金) 05:03:59.49ID:Eig2tonS0
こいつわざわざpythonスレにやってきて時代遅れの遺物を押し付けに来る荒らしだろ
2021/02/19(金) 05:37:12.65ID:473cJTkx0
ム板全域にいるよねこのガイジ
bashスレにもいた時は頭が痛くなったな
ふれあい作業所とかで遊んでればいいのにね
2021/02/19(金) 08:26:30.93ID:qL15PbA4D
相手するから喜ぶ
粛々とNGしとけ
2021/02/19(金) 09:49:46.59ID:SQn3IdCjM
ルビキチが珍しく質問に合ったレスを返してるのにお前らヒドイなw
2021/02/19(金) 09:55:27.59ID:SQn3IdCjM
プロジェクトのディレクトリ構成はアーキテクチャ設計を反映したもの

アーキテクチャ設計が詳細設計に含まれてるならで詳細設計段階で決める

Railsのようにアプリの機能構成に関係なく一律同じディレクトリ構成にするのもそれなりのメリットがある
709デフォルトの名無しさん (エムゾネ FF1f-ZFay)
垢版 |
2021/02/19(金) 15:40:30.15ID:LoU7pdW5F
>>707
日頃の行いが相応に報われてるだけ
フェミフェミ噛みついて本気でフェミに迷惑掛けてるのがフェミ
710デフォルトの名無しさん (ワッチョイ 035f-pQAD)
垢版 |
2021/02/19(金) 18:51:07.37ID:xy8YPNBA0
初心者です。画像の一部をクリックすると画面遷移を行うようなプログラムを
作りたいと考え、自分なりに作ってみたのですが
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class NG2to3 : MonoBehaviour
{

Vector2 Pos;
void Start()
{}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Pos = Input.mousePosition;
if (-15 <= this.Pos.x && this.Pos.x <= 15 &&
  -35 <= this.Pos.y && this.Pos.y <= -15 )

{
SceneManager.LoadScene("scene3");
}
}

}
}

このプログラムで指定したPosの範囲の場合画面遷移を行いたいのですが、
画面の至るところをタッチすれど遷移してくれません。
どこが間違っているのか教えていただきたいです。
2021/02/19(金) 19:22:01.16ID:YkVGv+Id0
>>710
https://docs.unity3d.com/ja/2018.4/ScriptReference/Input-mousePosition.html
読めよw
どっちにしても値は
xは0〜Screen.width - 1
yは0〜Screen.hright - 1
やろ
2021/02/19(金) 19:42:33.49ID:Eig2tonS0
ドキュメント読むのもそうだけど実際 にmousePositionの値を見たら良いと思うよ
2021/02/22(月) 02:08:01.45ID:aMOGcJaK0
構造体とリストどっちがいいとかあるの?
2021/02/22(月) 07:33:16.03ID:DBdQ6Dl10
どちらもいい
2021/02/22(月) 08:40:26.66ID:q2LnICsL0
構造体リストにしよう
2021/02/22(月) 09:21:08.61ID:KlgM0RdP0
>>713
まったく用途が違うから、普通はその二つでどちらにするかを迷うことはない
2021/02/22(月) 11:28:40.84ID:J1FRHNv90
>>713
夕食は弁当と定食どっちがいいと思う?
718デフォルトの名無しさん (ワッチョイ f361-cyI8)
垢版 |
2021/02/22(月) 18:39:45.74ID:5BxgjfJ50
リストじゃなくレコードじゃね?と言ってみるテスト
2021/02/22(月) 19:19:17.10ID:DBdQ6Dl10
structとclassの使い分けだったら質問の意図も分かるけど
720デフォルトの名無しさん (ラクッペペ MM7f-0TpN)
垢版 |
2021/02/22(月) 19:22:09.14ID:rk3Z26pVM
カレーとコンビニ、どっちにする?
721デフォルトの名無しさん (ワッチョイ 035f-pQAD)
垢版 |
2021/02/22(月) 21:06:02.69ID:8s+nkcdt0
スクリプトから条件で画像を表示させたいんですが、張り替えは出来ても新しく出現させることってできない?
2021/02/22(月) 21:22:09.87ID:7Jd6R0uh0
質問下手すぎでしょ
2021/02/22(月) 21:26:08.64ID:6SeUKgvV0
日本語でよろ
2021/02/22(月) 21:42:20.42ID:0aX736QQ0
I want to display an image conditionally from a script,
but can I make it appear new even if I can replace it?
2021/02/22(月) 21:45:15.13ID:/lIHFE+b0
5W1Hでよろ
2021/02/22(月) 23:51:22.27ID:nluN8fGs0
C#でWin32のHeapAlloc(GetProcessHeap(), 0, 0x1000);みたいなことするとGCと競合してバグるったりするの?
727デフォルトの名無しさん (ワッチョイ 035f-pQAD)
垢版 |
2021/02/23(火) 00:10:32.83ID:qmo9+9Uk0
すいませんw
2Dunityでボタンを押したら画像を表示できるようなプログラムを作りたいのですが、
調べてみても元々ある画像をスクリプトによって別の物に変更するものはあれど
ボタンを押して0から画像を表示させることができるようなものを
見つけられなかったので、できないのかなと。。。どうなんでしょう?
2021/02/23(火) 00:26:01.44ID:DnkfMlNP0
できる
729デフォルトの名無しさん (ワッチョイ 035f-pQAD)
垢版 |
2021/02/23(火) 01:56:55.10ID:qmo9+9Uk0
>>728
詳細を教えていただきたいですw(__)
2021/02/23(火) 02:13:02.76ID:6EEdG0Ut0
>>726
アンマネージドだろうから特に影響なさそうだけどね
2021/02/23(火) 09:57:34.63ID:kvat21cB0
Windows下におけるmalloc = HeapAllocだけど
どこかしらでロードせざるを得ないネイティブdll内で当然の如くmallocは行われまくってる訳だからその程度でバグったら言語として成り立たない
2021/02/23(火) 10:05:27.49ID:IRMSQgrY0
バグったらHeapDestroyすれば良いじゃない。by マリー
2021/02/23(火) 10:05:48.25ID:OuCytsjB0
>>727
'c# image 生成' で調べれば?
2021/02/23(火) 10:07:40.79ID:8QyPv/It0
unityでの載せ方がわからないんじゃね?
2021/02/23(火) 10:10:41.92ID:8QyPv/It0
c# image create unity
でググった

こんなん?
https://teratail.com/questions/42899
736デフォルトの名無しさん (ワッチョイ 035f-pQAD)
垢版 |
2021/02/23(火) 12:52:43.06ID:qmo9+9Uk0
>>735
こちらを参考にSetaActiveを使えばできました!
ありがとうございます。
2021/02/23(火) 17:06:07.35ID:Ke2QO8XG0
質問よろしくお願いします。

uint 型の二つの値 x, y について、

x = 0b_0101, y = 0b_0110

のように最上位の 1 のビットの位置が同じなら true を返し、

x = 0b_0101, y = 0b_0011

のように最上位の 1 のビットの位置が違うなら false を返す関数を
作るというクイズをやっていて、

static bool BitsEquals(uint x, uint y) => (x ^ y) < (x & y);

という答えを考えました。
しかし、どうやらもっと演算の回数が少なくてすむ方法があるらしく、
それがどうしても分かりません。

どなたか良いアイディアをお持ちの方がいらっしゃれば教えていただけないでしょうか。
どうぞよろしくお願いいたします。
2021/02/23(火) 18:54:24.22ID:oVEFpcof0
>>737
あるらしいって、誰かが言ってたならその人に聞けばすむ話でないの?
クイズでも出されたの?
2021/02/23(火) 19:56:17.34ID:8AF7Ea+I0
クイズって書いてあるな・・

>>737
2つ目の例でも最上位ビットはどちらも0で同じように見えるが?
比較する2つの数値はビット長が一緒なのかとか、もうちょい仕様を詳しく
2021/02/23(火) 20:19:12.56ID:lNyBX+Rq0
>>739
最上位ビットではなくて1になってるビットの最上位だぞ
2021/02/23(火) 20:25:36.23ID:BNINfFnp0
>>727
ツー・デュニティって何のことかと思った
2021/02/23(火) 20:26:05.61ID:Ke2QO8XG0
レスありがとうございます!

>>738
> クイズでも出されたの?
おっしゃるとおりです。ネットで調べるのは OK なのですが、
外国語も含めて検索してみても私の力では解決できそうになかったので
こちらで質問させていただきました。


>>739
説明がうまくできなくて申し訳ありません。

x = 0b_0101, y = 0b_0110

の例だと、1 になっているビットで最上位のものが
両方とも下から数えて 3 番目なので true なのですが、

x = 0b_0101, y = 0b_0011

の例だと、x は先ほどと同じですが y のほうは 1 になっているビットで
最上位のものが下から数えて 2 番目なので、false になります。


>>740
補足どうもありがとうございます。
最上位ビット(MSB)というと普通は >>739 さんのおっしゃっているような
意味で捉えられそうなものなので、最初からもう少し丁寧に説明すべきでした。


どうぞよろしくお願いいたします。
2021/02/23(火) 20:26:52.22ID:iu17pC6m0
>>739
> 比較する2つの数値はビット長が一緒なのか
さすがにそれは仮定してもいいんじゃね?
2021/02/23(火) 20:47:25.97ID:8AF7Ea+I0
それなら
2*x<y
でいいんじゃないの?
trueなら一番左の1の位置は同じ
2021/02/23(火) 20:57:42.88ID:iu17pC6m0
>>744
x = 1, y = 1 がfalseになるんですけど…
2021/02/23(火) 21:04:05.18ID:8AF7Ea+I0
それは失礼w

難しいね
y:123456789abcdef
x:12 4   8
2021/02/23(火) 21:55:49.11ID:26JD/Fyv0
演算の回数っていうのがよくわからないが、
BitOperations.LeadingZeroCount(val)
の比較じゃダメなの?
2021/02/23(火) 22:04:06.39ID:6EEdG0Ut0
>>747
普通に考えたら命令ステップ数のことだろうな

今の時点でビット演算2つと比較が1つなので、boolを返す以上は比較は外せないから、これより少ない(軽い)となると、なかなか難しいね
2021/02/23(火) 22:07:00.98ID:iu17pC6m0
>>737みたいに4bit同士程度ならテーブル引くとかでもいいかも
2021/02/23(火) 22:14:05.32ID:6EEdG0Ut0
>>749
uint でって指定されてるわけだから、4ビットで書かれてるのはあくまで例でわかりやすくしてくれてるだけでしょ
2021/02/23(火) 22:33:00.48ID:W3jldd/z0
>>746
return x==y || (2x<y && y<=x);

って感じか?わかりづれぇw
2021/02/23(火) 22:53:10.92ID:W3jldd/z0
なんか違うな。
要は>>746に書いてある通り、xとyが1,2,4,8,16,32・・・みたいに
一番左の1が立ってる同じグループにいるかでしょ?
酔っぱらってて頭まわらんw
2021/02/24(水) 00:39:34.09ID:bQ0lAzRD0
(x^y)<(x<y?x:y)
こんなのはいいのかな?
細かくテストしてないからバグってたらごめん
演算1回比較2回だから演算回数は減ったとも言える
どっちが早いかは最適化とかCPUとか次第な気もするけど
2021/02/24(水) 00:52:24.83ID:jmWlpF6B0
皆様レスどうもありがとうございます。

>>743
> > 比較する2つの数値はビット長が一緒なのか
> さすがにそれは仮定してもいいんじゃね?
補足ありがとうございます。
ひとまず、符号なし32ビット長整数ということにさせてください。

>>744
> 2*x<y
> でいいんじゃないの?
実際、(x ^ y) < (x & y) より簡単なものを探そうとすると
もうそのくらい簡単なものくらいしか候補に残らないですよね。
もしくは、何か発想の転換が必要なんでしょうか。。。

>>745
> x = 1, y = 1 がfalseになるんですけど…
このレスを読んで思ったのですが、
(x ^ y) < (x & y) という計算も x = 0, y = 0 のときは
false になるんですよね。
最上位の 1 の位置を比較するのが目的なので
x や y が 0 のときは気にしなくてもいいのかもしれませんが、
やはりちょっと不自然なので (x ^ y) <= (x & y) のように
等号付き不等号にしたほうがベターでしょうか。
(ただ、
 Math.Floor(Math.Log(2, x)) == Math.Floor(Math.Log(2, y))
 という式は x = 0, y = 0 のとき false になるようです)
2021/02/24(水) 00:54:09.63ID:jmWlpF6B0
>>747
> BitOperations.LeadingZeroCount(val)
> の比較じゃダメなの?
なるほど!こんな関数があるんですね。
BitOperations クラスのドキュメントを読んでみると
「これらのメソッドでは、基になるプラットフォームで使用可能な場合、
 ハードウェアの組み込みを使用します。」
と書いてあるので、良い答えになりそうです。
アドバイスどうもありがとうございます。

>>748
> 今の時点でビット演算2つと比較が1つなので、boolを返す以上は比較は外せないから、
> これより少ない(軽い)となると、なかなか難しいね
難しいですよね?!
普通の演算子だけを使うなら考えられるパターンは限られているので、
やはり拡張命令を使うとかテーブルを用意するとか、
なにか根本的な発想の転換が必要なのかもしれません。

>>749
> 4bit同士程度ならテーブル引くとかでもいいかも
>>750
> uint でって指定されてるわけだから、4ビットで書かれてるのはあくまで例でわかりやすくしてくれてるだけでしょ
>>750 さんが言ってくださっているとおりなのですが、
逆にわかりにくくなってしまったかもしれません。失礼しました。
ただ、普通の演算子を組み合わせるだけの方法ではどうにも手詰まりな気がしてきたので、
テーブルというアイディア自体は検討する価値がありそうです。どうもありがとうございます。
2021/02/24(水) 00:54:22.31ID:bQ0lAzRD0
boolのために比較が必要という前提なら比較は6種
== != < <= > >=
2項演算子は加減乗除商、シフト、and or xorくらい?
演算→比較の順に評価することになるので1比較1演算のパターンはそんなに多くない
全部試したわけじゃないけど無理じゃない?
2021/02/24(水) 00:58:28.94ID:jmWlpF6B0
>>751
> return x==y || (2x<y && y<=x);

>>753
> (x^y)<(x<y?x:y)

色々と考えてくださってどうもありがとうございます。

>>745 さんの猿まねですが、
>>751 さんが書いてくださった式は x = 2, y = 3 のときに false となり、
>>753 さんが書いてくださった式は x = 1, y = 3 のときに true になってしまいますねw

ただ、こうやって苦労を分かち合ってくださるのはとても心が救われます。
本当にどうもありがとうございます。
2021/02/24(水) 01:04:08.81ID:jmWlpF6B0
>>756
> boolのために比較が必要という前提なら比較は6種
> == != < <= > >=
> 2項演算子は加減乗除商、シフト、and or xorくらい?
> 演算→比較の順に評価することになるので1比較1演算のパターンはそんなに多くない
> 全部試したわけじゃないけど無理じゃない?

レスどうもありがとうございます。確かにおっしゃるとおりのような気がしてきているところです。
とりあえずこの前提の場合だけでも (x ^ y) < (x & y) が最善なのかどうか結論を出したいので、
全パターンを網羅して確認するプログラムの作成に挑戦してみたいと思います。(できるかな…(汗)
2021/02/24(水) 01:07:30.18ID:OSOzzlvda
>>737
0を排除できるなら、たぶん
x/y + y/x == 1
になるような気がする。
全然演算の量が減ってる気はしないけどw
2021/02/24(水) 01:08:45.27ID:OSOzzlvda
あ、これじゃX == yの時2になるからダメかw
2021/02/24(水) 01:11:25.71ID:jmWlpF6B0
>>756
全部網羅と簡単に書きましたが、
例えば仮に (20210224 * x ^ y) < 12345 が正解だとして、
しらみつぶしに探してこれを見つけるのは至難のワザですよね。
う〜ん、難しい。。。。
2021/02/24(水) 01:15:30.76ID:bQ0lAzRD0
>>757
もともと提示された式と比較すると同じ結果になるんだけど?
https://sharplab.io/#v2:C4LgTgrgdgNAJiA1AHwAICYAMBYAUBgRjzwDMB7MACgDcBDMAAgEsGBeBzAbmYYB53MAIwD6mAuO5NEiAJR4GChuSp1GAKzYduG/hxFiJDNdLm5F55iQaUAxgAsApjYDWmSkxhqZDAITt7Ts4E7p4yphYRDKgEAJyUACQARFBkwAwOAI4QtAA2IADeTAC+MAz5akWJMpzykebE+AQAbAyCZGQ5DAEubkxQaQAepX1pAJ7erAB81gMMAHoM43wzDABki9V40S1tHV2OLsEjDEPM/Rts05SzC0u8K/ejDAD8JwwgGzW4QA
2021/02/24(水) 01:20:20.17ID:jmWlpF6B0
>>759
> 0を排除できるなら、たぶん
> x/y + y/x == 1
> になるような気がする。

!!!
確かにこれ自体は違うかもしれませんし、計算量も減っているとは思いませんが、
発想の新鮮さは私にとって正直感動を覚えるほどでした。

私は問題文にビットという言葉が出ている時点で数値をビットの並びとしか捉えていなくて、
このレスを読むまで数値を数値として扱うという発想がまったくもって出てきていませんでした。

貴重なアイディアどうもありがとうございます。
2021/02/24(水) 01:22:06.74ID:xxKZPG3j0
>>761
演算子のコストは概ね下記のようになってるので、今のところ 737 の式が一番高速だな

代入、加算、減産、ビット演算 < 乗算 < 分岐 < 除算
765デフォルトの名無しさん (ブーイモ MMe7-Dcdc)
垢版 |
2021/02/24(水) 09:43:01.27ID:BstpO7i2M
NOT(x ^ y) &x &y
766デフォルトの名無しさん (ブーイモ MMe7-Dcdc)
垢版 |
2021/02/24(水) 09:47:44.01ID:BstpO7i2M
ビット反転は ~か
~(x ^ y) &x &y
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況