这个按位AND运算符如何屏蔽该数字的低七位?

时间:2013-08-09 17:08:54

标签: c bit-manipulation bit bitwise-operators

我正在阅读Brian Kernigan和Dennis Ritchie撰写的 The C Programming Language 。以下是关于按位AND运算符的说法:

  

按位AND运算符&通常用于屏蔽某些位,例如,

    n = n & 0177 
     

n的低位7位设置为零。

我不太清楚如何屏蔽n的低七位。请有人澄清一下吗?

5 个答案:

答案 0 :(得分:30)

数字0177八进制数字,代表下面的二进制模式:

0000000001111111

AND使用按位运算&时,结果只将原始位保留在“掩码”中设置为1的位中;所有其他位变为零。这是因为“AND”遵循这条规则:

X & 0 -> 0 for any value of X
X & 1 -> X for any value of X

例如,如果您AND 01770545454,则

0000000001111111 -- 0000177
0101010101010101 -- 0545454
----------------    -------
0000000001010101 -- 0000154

答案 1 :(得分:6)

在C中,前缀为0的整数文字是八进制数,因此0177是八进制数。

每个八进制数字(值07)用3位表示,7是每个数字的最大值。因此,八进制值7表示设置3位。

答案 2 :(得分:5)

由于0177是一个八进制文字,每个八进制数是3三位,所以有以下二进制等价:

7  = 111
1  = 001

这意味着0177为二进制001111111

答案 3 :(得分:4)

已经解释过第一个' 0 '用于 ANSI C 中数字的八进制表示。实际上,数字 0177 (八进制)与 127 (十进制)相同, 128-1 ,也可以表示为{ {1}}和二进制表示中的2^7-1表示取n 1'并将所有1'放在右边。

0177 = 127 = 128-1

位掩码;

000000000000000000000000 1111111

您可以查看下面的代码;

演示

2^n-1

输出

#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;
}

答案 4 :(得分:0)

0177是一个八进制值,每个数字由3位表示,形成值000到111所以0711转换为001111111,如果你考虑32位二进制(也可以是64位,除了剩余的数字按照每个数字填充)在这种情况下,值为0)形式的MSB即符号位是0000000000000000000000001111111并且对于给定数量对其执行按位,将输出n位数中其余数字的数字转换的低7位为0。

(since x&0 =0 & x&1=x e.g 0&0=0 ,1&0=0, 1&1=1 0&1=1)