我正在阅读Brian Kernigan和Dennis Ritchie撰写的 The C Programming Language 。以下是关于按位AND运算符的说法:
按位AND运算符
&
通常用于屏蔽某些位,例如,n = n & 0177
将
n
的低位7位设置为零。
我不太清楚如何屏蔽n
的低七位。请有人澄清一下吗?
答案 0 :(得分:30)
数字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
答案 1 :(得分:6)
在C中,前缀为0
的整数文字是八进制数,因此0177
是八进制数。
每个八进制数字(值0
到7
)用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)