这个按位与运算符如何屏蔽数字的低七位?
Posted
技术标签:
【中文标题】这个按位与运算符如何屏蔽数字的低七位?【英文标题】:How is this bitwise AND operator masking the lower seven order bits of the number? 【发布时间】:2013-08-11 16:50:27 【问题描述】:我正在阅读 Brian Kernigan 和 Dennis Ritchie 的C 编程语言。下面是关于按位 AND 运算符的说明:
按位与运算符
&
通常用于屏蔽某些位集,例如,n = n & 0177
除
n
的低 7 位之外的所有位都设置为零。
我不太明白它是如何屏蔽n
的低七位的。请问有人能解释一下吗?
【问题讨论】:
0177
是八进制
八进制已经过时了,今天你会使用0x7f
。
【参考方案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)
【讨论】:
以上是关于这个按位与运算符如何屏蔽数字的低七位?的主要内容,如果未能解决你的问题,请参考以下文章