这个按位与运算符如何屏蔽数字的低七位?

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 01770545454,你会得到

0000000001111111 -- 0000177
0101010101010101 -- 0545454
----------------    -------
0000000001010101 -- 0000154

【讨论】:

【参考方案2】:

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

每个八进制数字(值 07)用 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)

【讨论】:

以上是关于这个按位与运算符如何屏蔽数字的低七位?的主要内容,如果未能解决你的问题,请参考以下文章

除了按位与之外还有其他用途吗[重复]

位运算符按位与按位或按位非左移右移原码反码补码

按键^异或运算符

位运算(按位与按位或异或)

位运算(按位与按位或异或)

按位与运算符