Brian Kernigan と Dennis Ritchie によるC プログラミング言語を読んでいます。ビットごとの AND 演算子について次のように述べています。
ビットごとの AND 演算子
&
は、多くの場合、一部のビット セットをマスクするために使用されます。たとえば、次のようになります。n = n & 0177
の下位 7 ビットを除くすべてをゼロに設定します
n
。
の下位 7 ビットがどのようにマスクされているのかよくわかりませんn
。誰かが明確にできますか?
Brian Kernigan と Dennis Ritchie によるC プログラミング言語を読んでいます。ビットごとの AND 演算子について次のように述べています。
ビットごとの AND 演算子
&
は、多くの場合、一部のビット セットをマスクするために使用されます。たとえば、次のようになります。n = n & 0177
の下位 7 ビットを除くすべてをゼロに設定します
n
。
の下位 7 ビットがどのようにマスクされているのかよくわかりませんn
。誰かが明確にできますか?
数値0177
は、以下のバイナリ パターンを表す8 進数です。
0000000001111111
AND
ビット単位の操作を使用すると、結果は「マスク」で&
設定されたビットにのみ元のビットを保持します。1
他のすべてのビットはゼロになります。これは、「AND」が次の規則に従うためです。
X & 0 -> 0 for any value of X
X & 1 -> X for any value of X
たとえば、あなたAND
0177
との場合、次の0545454
ようになります。
0000000001111111 -- 0000177
0101010101010101 -- 0545454
---------------- -------
0000000001010101 -- 0000154
C では、 で始まる整数リテラルは 8 進数で0
あり、8 進数でも0177
あります。
各 8 進数 (値0
~7
) は 3 ビットで表され7
、各桁の最大値です。したがって、7
8 進数の値は3
ビット セットを意味します。
0177
は 8 進数リテラルであり、各 8 進数は3
3 ビットであるため、次の 2 進数に相当します。
7 = 111
1 = 001
これは0177
バイナリ001111111
であることを意味します。
ANSI Cでは、最初の ' 0 'が数値の8 進表現に使用されることは既に説明しました。実際には、数値0177 (8 進数) は127 (10進数) と同じで、 128-1として表すこともできます。2進数表現では、n 個の 1 を取り、すべての 1 を右側に配置することを意味します。2^7-1
2^n-1
0177 = 127 = 128-1
これはビットマスクです。
000000000000000000000000 1111111
以下のコードを確認できます。
#include <stdio.h>
int main()
{
int n = 0177; // octal representation of 127
printf("Decimal:[%d] : Octal:[%o]\n", n, n, n);
n = 127; // decimal representation of 127
printf("Decimal:[%d] : Octal:[%o]\n", n, n, n);
return 0;
}
Decimal:[127] : Octal:[177]
Decimal:[127] : Octal:[177]
0177 は 8 進値で、各桁は 000 から 111 までの値の 3 ビットで表されるため、0177 は 001111111 (つまり 001|111|111) に変換されます。桁は MSB に従って入力されます。つまり、この場合の符号ビットは値 0) 形式であり、000000000000000000000001111111 であり、指定された数値に対してビット単位で実行すると、数値の下位 7 ビットが出力され、n-ビット番号を 0 にします。
(since x&0 =0 & x&1=x e.g 0&0=0 ,1&0=0, 1&1=1 0&1=1)