web-dev-qa-db-ja.com

整数に対する単一のアンパサンド演算子(&)の動作を理解する

通常、単一のアンパサンド演算子が「ビット単位のAND」演算に使用されることを理解しています。しかし、2つの数値を比較するために使用したときに得られる興味深い結果を誰かが説明するのを手伝ってもらえますか?

例えば;

(6 & 2) = 2
(10 & 5) = 0
(20 & 25) = 16
(123 & 20) = 16

これらの結果の間に論理的なリンクはないようです-私は何かが欠けていますか?オンラインドキュメントは、ブール値またはシングルビットの比較のみを参照しているようです。

30
Jonathan

それらのそれぞれのバイナリ表現を比較します。

    110 &     010 =     010
   1010 &    0101 =    0000
  10100 &   11001 =   10000
1111011 & 0010100 = 0010000

いずれの場合も、入力の左側と右側の両方で1の場合にのみ、結果の数字は1になります。

51
Jeffrey Hantin

数値を2進表現に変換する必要があります。そうすると、6&2 = 2は実際には110&010 = 010などの結果間のリンクが表示されます。10&5は1010&0101 = 0000です。

6
Valentin Kuzub

2進数と演算は、2進数で表される整数に対して実行されます。例えば

110  (6)
010  (2)
--------
010  (2)
4
abesto

ビット単位のANDは、まさにそれを実行します。ビットに対してAND演算を実行します。

したがって、結果を予測するには、数値ではなくビットを確認する必要があります。

ANDは、同じ位置に両方の番号に1がある場合にのみ、1を与えます。

6(110) & 2(010) =  2(010)
10(1010) & 5(0101) = 0(0000)

ビットごとのORは、同じ位置のいずれかの数値に1がある場合、1を返します。

6(110) | 2(010) =  6(110)
10(1010) | 5(0101) = 15(1111)
2
Yochai Timmer
6     = 0110
2     = 0010 
6 & 2 = 0010

20      = 10100
25      = 11001
20 & 25 = 10000

(これは計算が間違っているようです)

等...

2
Nick

内部的には、整数は バイナリ形式 で格納されます。それについて読むことを強くお勧めします。数値のビット単位の表現について知ることは非常に重要です。

そうは言っても、ビット単位の比較では、パラメーターのビットが比較されます。

Decimal: 6    &    2 = 2
Binary:  0110 & 0010 = 0010
2
Botz3000

Bitwize ANDは、2進表記のビットを1つずつ一致させ、その結果、2つの数値の間にあるビットが生成されます。

数値を2進数に変換するには、2進数システムを理解する必要があります。

たとえば、6 = 110バイナリ

110は、1x4 + 1x2 + 0x1 = 6を表します。

2は、0x4 + 1x2 + 0x1 = 2になります。

ビットワイズし、両方の数値に位置が設定されている位置のみを保持します。この場合は2のビットであり、結果は2になります。

すべての余分なビットは最後の2倍であるため、4ビットの数値は乗数8、4、2、1を使用し、したがって0から15(乗数の合計)までのすべての数値を表すことができます。

0