【问题标题】:How is this bitwise AND operator masking the lower seven order bits of the number?这个按位与运算符如何屏蔽数字的低七位?
【发布时间】:2023-03-28 22:27:02
【问题描述】:
我正在阅读 Brian Kernigan 和 Dennis Ritchie 的C 编程语言。下面是关于按位 AND 运算符的说明:
按位与运算符& 通常用于屏蔽某些位集,例如,
n = n & 0177
除n 的低 7 位之外的所有位都设置为零。
我不太明白它是如何屏蔽n 的低七位的。请问有人能解释一下吗?
【问题讨论】:
标签:
c
bit-manipulation
bit
bitwise-operators
【解决方案1】:
数字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
【解决方案2】:
在 C 中,以 0 为前缀的整数文字是八进制数,因此 0177 是八进制数。
每个八进制数字(值 0 到 7)用 3 位表示,7 是每个数字的最大值。所以八进制的7 值意味着3 位已设置。
【解决方案3】:
由于0177 是一个八进制文字,并且每个八进制数是3 您拥有的三位,因此以下二进制等效项:
7 = 111
1 = 001
这意味着0177 在二进制中是001111111。
【解决方案4】:
前面已经解释过,第一个'0' 用于ANSI C 中数字的八进制表示。实际上,数字0177(八进制)与127(十进制)相同,即128-1,也可以表示为@ 987654321@和2^n-1在二进制表示中表示取n个1并将所有1放在右边。
0177 = 127 = 128-1
这是一个位掩码;
00000000000000000000000001111111
您可以查看下面的代码;
演示
#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]
【解决方案5】:
0177 是一个八进制值,每个数字由 3 位表示,从值 000 到 111,因此 0177 转换为 001111111(即 001|111|111),如果您考虑 32 位二进制(也可以是 64 位,除了其余数字根据 MSB 填充,即在这种情况下的符号位值 0) 形式为 0000000000000000000000001111111 并对给定数字执行按位运算,将输出数字的低 7 位n 位数为 0。
(since x&0 =0 & x&1=x e.g 0&0=0 ,1&0=0, 1&1=1 0&1=1)