29

Brian Kernigan と Dennis Ritchie によるC プログラミング言語を読んでいます。ビットごとの AND 演算子について次のように述べています。

ビットごとの AND 演算子&は、多くの場合、一部のビット セットをマスクするために使用されます。たとえば、次のようになります。

    n = n & 0177 

の下位 7 ビットを除くすべてをゼロに設定しますn

の下位 7 ビットがどのようにマスクされているのかよくわかりませんn。誰かが明確にできますか?

4

5 に答える 5

35

数値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
于 2013-08-09T17:10:51.090 に答える
6

C では、 で始まる整数リテラルは 8 進数で0あり、8 進数でも0177あります。

各 8 進数 (値07) は 3 ビットで表され7、各桁の最大値です。したがって、78 進数の値は3ビット セットを意味します。

于 2013-08-09T17:11:01.450 に答える
5

0177は 8 進数リテラルであり、各 8 進数は33 ビットであるため、次の 2 進数に相当します。

7  = 111
1  = 001

これは0177バイナリ001111111であることを意味します。

于 2013-08-09T17:13:47.970 に答える
4

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]
于 2016-04-20T03:03:18.863 に答える
1

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)
于 2014-11-12T22:21:12.640 に答える