C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

1なら0、0なら1を返す関数

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■87802 / inTopicNo.1)  1なら0、0なら1を返す関数
  
□投稿者/ ヤンゴン (1回)-(2018/07/01(Sun) 16:11:02)

分類:[.NET 全般] 

integerの引数を受け取って、
1なら0、0なら1 を返す関数ってありますか?
Not関数が使えるかと思ったのですが
なぜか、-2と-1という結果になるのですが・・・

引用返信 編集キー/
■87803 / inTopicNo.2)  Re[1]: 1なら0、0なら1を返す関数
□投稿者/ リンク (1回)-(2018/07/01(Sun) 17:15:58)
No87802 (ヤンゴン さん) に返信

Xor 1なら行けるんじゃないでしょうか
関数じゃないですけど
引用返信 編集キー/
■87804 / inTopicNo.3)  Re[1]: 1なら0、0なら1を返す関数
□投稿者/ WebSurfer (1538回)-(2018/07/01(Sun) 18:15:35)
No87802 (ヤンゴン さん) に返信

自作すればよいと思うのですが、自作できない理由があるのでしょうか?
引用返信 編集キー/
■87806 / inTopicNo.4)  Re[1]: 1なら0、0なら1を返す関数
□投稿者/ 魔界の仮面弁士 (1731回)-(2018/07/01(Sun) 19:37:33)
No87802 (ヤンゴン さん) に返信
> integerの引数を受け取って、
ということは、VB.NET でしょうか?
[.NET 全般]が選択されているという事は、Office VBA 等でも無いでしょうし。


> Not関数が使えるかと思ったのですが
VB だとしたら、Not は関数では無く演算子です。
整数型に対する Not 演算は、各ビットの 1 と 0 を反転させます。


> なぜか、-2と-1という結果になるのですが・・・
VB.NET の Integer 型だとすると、
「Not 0」は -1 で、「Not 1」は -2 です。
「Not -1」は 0 で、「Not -2」は 1 です。


・10 進数の「0」= 2 進数の「00000000000000000000000000000000」= 16 進数の「00000000」
・10 進数.「-1」= 2 進数の「11111111111111111111111111111111」= 16 進数の「FFFFFFFF」

・10 進数の「1」= 2 進数の「00000000000000000000000000000001」= 16 進数の「00000001」
・10 進数.「-2」= 2 進数の「11111111111111111111111111111110」= 16 進数の「FFFFFFFE」

・10 進数の「2」= 2 進数の「00000000000000000000000000000010」= 16 進数の「00000002」
・10 進数.「-3」= 2 進数の「11111111111111111111111111111101」= 16 進数の「FFFFFFFD」

・10 進数.「15」= 2 進数の「00000000000000000000000000001111」= 16 進数の「0000000F」
・10 進数「-16」= 2 進数の「11111111111111111111111111110000」= 16 進数の「FFFFFFF0」

・10 進数.「16」= 2 進数の「00000000000000000000000000010000」= 16 進数の「00000010」
・10 進数「-17」= 2 進数の「11111111111111111111111111101111」= 16 進数の「FFFFFFEF」

・10 進数.「99」= 2 進数の「00000000000000000000000001100010」= 16 進数の「00000062」
・10 進数「-99」= 2 進数の「11111111111111111111111110011101」= 16 進数の「FFFFFF9D」

引用返信 編集キー/
■87807 / inTopicNo.5)  Re[1]: 1なら0、0なら1を返す関数
□投稿者/ 魔界の仮面弁士 (1732回)-(2018/07/01(Sun) 19:55:34)
No87802 (ヤンゴン さん) に返信
> integerの引数を受け取って、
> 1なら0、0なら1 を返す関数ってありますか?

そのような関数があったとして、もしも「1 でも 0 でも無い値」が
渡された場合に、どのような結果になってほしいのでしょうか?


『関数』であることにこだわらないのであれば、たとえば
  Public ヤンゴン() As Integer = New Integer() {1, 0}
などを用意しておけば、利用する側としては関数っぽくなりますが…。

Dim a As Integer = ヤンゴン(0) 'a には 1 がセットされる
Dim b As Integer = ヤンゴン(1) 'b には 0 がセットされる


それ以外の方法としては……「1 でも 0 でも無い値」に対する要件次第ですが、
「If 三項演算子」「IIf 関数」「Choose 関数」などを使う手もあります。

とりあえず 4 パターン程上げておきます。

Dim w As Integer = Math.Abs(1 - value)
Dim x As Integer = CInt(Choose(value + 1, 1, 0))
Dim y As Integer = CInt(IIf(value = 0, 1, 0))
Dim z As Integer = If(value = 0, 1, 0)
引用返信 編集キー/
■87809 / inTopicNo.6)  Re[1]: 1なら0、0なら1を返す関数
□投稿者/ shu (1126回)-(2018/07/01(Sun) 21:49:18)
No87802 (ヤンゴン さん) に返信
> integerの引数を受け取って、
> 1なら0、0なら1 を返す関数ってありますか?
> Not関数が使えるかと思ったのですが
> なぜか、-2と-1という結果になるのですが・・・
>
既に出ている懸念事項はありますが
数値aとbのみ値を取り
xがaならb
xがbならa
という結果を得る式は
(a + b) - x
となります。
今回のaが0,bが1のケースですと
1-x
となります。

引用返信 編集キー/
■87823 / inTopicNo.7)  Re[2]: 1なら0、0なら1を返す関数
□投稿者/ ぶなっぷ (184回)-(2018/07/03(Tue) 10:23:37)
参考までに、なぜ、
> VB.NET の Integer 型だとすると、
>「Not 0」は -1 で、「Not 1」は -2 です。
>「Not -1」は 0 で、「Not -2」は 1 です。
なのか?

Integer型の 0
00000 ... 0000
の 全ビット反転
11111 ... 1111
が -1 (先頭は符号ビット)

Integer型の 1
00000 ... 0001
の 全ビット反転
11111 ... 1110
が -2

以下、同様です。

記憶が正しければ、VBのみの仕様であり、C#は違うはず。
引用返信 編集キー/
■87824 / inTopicNo.8)  Re[3]: 1なら0、0なら1を返す関数
□投稿者/ 魔界の仮面弁士 (1735回)-(2018/07/03(Tue) 10:55:52)
No87823 (ぶなっぷ さん) に返信
> 記憶が正しければ、VBのみの仕様であり、C#は違うはず。

えーと…? 何かの勘違いではないですかね。

C# であろうと VB であろうと、符号付整数型の最上位ビットが
符号ビットであることは同じかと。


そもそも C# に integer 型 は無いのですけれどね。int ならありますけど。
もちろん Not 演算子もありません。相当するのは、ビット反転のための ~ 演算子ですね。

int a = 0;
int b = 1;
int c = ~a;
int d = ~b;
Console.WriteLine(c); // -1
Console.WriteLine(d); // -2


もちろん、符号なし整数型(たとえば uint)に対するビット反転なら、
負数にはなりませんが、それは VB / VBA でも同じことなわけで。

Dim a As Byte: a = 0
Dim b As Byte: b = 1
Dim c As Byte: c = Not a
Dim d As Byte: d = Not b
Call MsgBox(c) '255
Call MsgBox(d) '254
引用返信 編集キー/
■87825 / inTopicNo.9)  Re[1]: 1なら0、0なら1を返す関数
□投稿者/ にゃるら (28回)-(2018/07/03(Tue) 11:54:45)
No87802 (ヤンゴン さん) に返信
> integerの引数を受け取って、
> 1なら0、0なら1 を返す関数ってありますか?
> Not関数が使えるかと思ったのですが
> なぜか、-2と-1という結果になるのですが・・・
>

VBのNOT演算子の説明は以下のページより
https://msdn.microsoft.com/ja-jp/library/dd314346.aspx

---------------------------
3-4-4 ビット演算

VB .NET には、ビット演算をおこなう演算子として、Not(ビット反転)... が用意されています。
これらの演算子を使うと、対象データについて各ビット単位に演算をおこなうことができます。
---------------------------

とあります。
1bitだけの型であるなら、0が1に、1が0になるのでは?という疑問はたしかですね。
でも1bit型というものでなければ、ビット反転ゆえに全部のbitが0->1になってしまい、
符号ありの整数だと
0 -> -1
1 -> -2
2 -> -3
・・・
ってなってしまいます。

ちなみにC#だと補数演算子「~」を使うことで同様の結果を得ることができます。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/bitwise-complement-operator

0->1、1->0だけのルールであればIIfなどを使って対処できるとは思います。
他にもパターンがあって、かつ演算による1つのルールで求められないパターンがあるようでしたら、ハッシュテーブルのようなものを作られるとよいかもしれないです。

引用返信 編集キー/
■87827 / inTopicNo.10)  Re[2]: 1なら0、0なら1を返す関数
□投稿者/ ぶなっぷ (185回)-(2018/07/03(Tue) 15:28:55)
すいません、確かに変なこと言ってました。
> 記憶が正しければ、VBのみの仕様であり、C#は違うはず。

私は、[VB の Not] と [C++ の !] が等価だと勘違いしていました。

C++ の !演算子は 0 か 1 しか返さないので、
VB の Not演算子 とは仕様が違う と言いたかったのです。

そもそも、C#ではint型に !演算子はコンパイルエラーのようです。

そして、そもそも論、
[VB の Not]に対応するののは [C++/C# の ~]なんですね。

失礼しました。

引用返信 編集キー/
■87829 / inTopicNo.11)  Re[3]: 1なら0、0なら1を返す関数
□投稿者/ shu (1129回)-(2018/07/03(Tue) 17:27:49)
x xor 1
の方が
0なら1
1なら0
それ以外はそれ以外の値と
なるので
まだよいかも。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ