我正在阅读Brian Kernigan 和 Dennis Ritchie的 The C Programming Language。以下是关于按位 AND 运算符的说明:
按位与运算符
&
通常用于屏蔽某些位集,例如,n = n & 0177
的低 7 位以外的所有位都设置为零
n
。
我不太明白它是如何屏蔽n
. 请问有人可以澄清吗?
我正在阅读Brian Kernigan 和 Dennis Ritchie的 The C Programming Language。以下是关于按位 AND 运算符的说明:
按位与运算符
&
通常用于屏蔽某些位集,例如,n = n & 0177
的低 7 位以外的所有位都设置为零
n
。
我不太明白它是如何屏蔽n
. 请问有人可以澄清吗?
该数字0177
是一个八进制数,表示下面的二进制模式:
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 中,以 为前缀的整数文字0
是八进制数,八进制数也是如此0177
。
每个八进制数字(值为)0
用7
3 位表示,并且7
是每个数字的最大值。所以7
八进制的值意味着3
位设置。
由于0177
是八进制文字,并且每个八进制数都是3
您拥有的三位,因此以下二进制等价物:
7 = 111
1 = 001
这意味着0177
是001111111
二进制的。
前面已经解释过,第一个“ 0 ”用于ANSI C中数字的八进制表示。实际上,数字0177(八进制)与127(十进制)相同,即128-1,也可以表示为,二进制表示的意思是取 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 是一个八进制值,每个数字由 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)