私はJavaでこの文を持っています:
System.out.println(3|4);
出力が7なのはなぜですか?
これはビット単位のOR操作です。バイナリレベルで物事を変更しています。
011 3
in binary: | 100 in decimal: | 4
___ ___
111 7
関数電卓を使用してWindows calcを開きます。 10進数と2進数(および16進数)を切り替えて、or、and、xorなどを含むビット演算を実行できます。
ビット単位で、頭の中や紙の上で行うには、同じ序数の各桁を比較します。いずれかの数値が1の場合、その序数での結果は1になります。
オペレーター |
は「ビット単位のOR」を実行します。 2ビットのビット単位ORの出力は、いずれかのビットが1の場合は1、両方のビットが0の場合は0です。2ビットのビット単位OR OR各ビットで個別に。
Heres how 3|4
動作:
3: 00000011
4: 00000100
--------------
3|4: 00000111 = 7
bitwise OR
操作、3 OR
4は7です。
こちらをご覧ください: http://en.wikipedia.org/wiki/Bitwise_OR#OR
バイナリ表現:
3 = 00000011
4 = 00000100
| is bitwise OR operator
OR 2つの数字の場合、バイナリ表現を取り、その列のOR結果は1 IFFです。少なくとも1つの列がtrue(1)に設定されています
そう
00000011
00000100
--------
00000111
次に、列はその位置の値を示します。
128, 64, 32, 16, 8, 4, 2, 1
そう
128, 64, 32, 16, 8, 4, 2, 1
0 , 0, 0, 0, 0, 1, 1, 1
1の列は、その列の値を追加することを意味します。
4 + 2 + 1 = 7
| 「ビット単位のOR」演算子です。 a | bでは、aおよび/またはbのn番目のビットが1の場合、結果のn番目のビットは1になります。3は2進数で11です。 4はバイナリで100です。
0 1 1
or or or
1 0 0
= = =
1 1 1
そして、111はたまたま7のバイナリ表現です。
これの基礎を数えるための一般化されたシステムがあることを理解することは有用です。バイナリはbase-2です。おなじみの10進数は10進数です。 Linuxの許可の8進数は8進数です。
数字の値は、その数字のそれぞれの個々の値を加算することによって取得されます。任意の数字について、値は単純な式から導出されます。
(数字)*(基数)^(小数点の左側の桁数)
123 = 123 =(1 * 10 ^ 2)+(2 * 10 ^ 1)+(3 * 10 ^ 0)= 100 + 20 + 3
私はCS211でそれを学んだ(自慢ではなく、ただ覚えている)
ビットごとの演算子は、相関するものがないと少し混乱する可能性があるため、それらの機能を非プログラマーに説明した方法は、trueに1を、falseに0を代入するだけで、その後の演算子と同じように動作する英語:
月は青で、空は青、偽です
0および1は0
月は青いOR空は青い、true
0または1は1
しかし、次のようになったときに類推が崩れます。
海は青XOR木は緑、偽