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、各桁の最大値です。したがって、78 進数の値は3ビット セットを意味します。
0177は 8 進数リテラルであり、各 8 進数は33 ビットであるため、次の 2 進数に相当します。
7 = 111
1 = 001
これは0177バイナリ001111111であることを意味します。
ANSI Cでは、最初の ' 0 'が数値の8 進表現に使用されることは既に説明しました。実際には、数値0177 (8 進数) は127 (10進数) と同じで、 128-1として表すこともできます。2進数表現では、n 個の 1 を取り、すべての 1 を右側に配置することを意味します。2^7-12^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)