29

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

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

    n = n & 0177 

的低 7 位以外的所有位都设置为零n

我不太明白它是如何屏蔽n. 请问有人可以澄清吗?

4

5 回答 5

35

该数字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
于 2013-08-09T17:10:51.090 回答
6

在 C 中,以 为前缀的整数文字0是八进制数,八进制数也是如此0177

每个八进制数字(值为)073 位表示,并且7是每个数字的最大值。所以7八进制的值意味着3位设置。

于 2013-08-09T17:11:01.450 回答
5

由于0177是八进制文字,并且每个八进制数都是3您拥有的三位,因此以下二进制等价物:

7  = 111
1  = 001

这意味着0177001111111二进制的。

于 2013-08-09T17:13:47.970 回答
4

前面已经解释过,第一个“ 0 ”用于ANSI C中数字的八进制表示。实际上,数字0177(八进制)与127(十进制)相同,即128-1,也可以表示为,二进制表示的意思是取 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 是一个八进制值,每个数字由 3 位表示,从值 000 到 111,因此 0177 转换为 001111111(即 001|111|111),如果您考虑 32 位二进制(也可以是 64 位,除了数字根据 MSB 填充,即符号位在这种情况下值 0) 形式为 0000000000000000000000001111111 并对给定数字执行按位运算,将输出数字的低 7 位位号为 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 回答