无法理解位运算

Can`t comprehend the bitwise operations

阅读 K&R 书时,我偶然发现了第 2.9 章,它描述了 C 中的按位运算符。一开始就有这样的声明:

The bitwise AND operator & is often used to mask off some set of bits, for example n = n & 0177; sets to zero all but the low-order 7 bits of n.

我对它的真正含义有点困惑。十六进制(如果我没记错的话)0177 是如何表示低 7 位的?我试图在代码中测试它,下面是我所做的:

#include <stdio.h>

int main()
{
    int n = 1490;
    n = n & 0177;
    printf("%i\n", n);
}

代码的输出是 82。将 1490 转换为二进制我得到 10111010010,在将除 7 个低位之外的所有位设置为零后,我最终得到 1010010,它实际上等于十进制的 82。为了理解引擎盖下的逻辑,我手动应用了 &(AND) 运算符,但结果是一个完全不同的数字。我做错了什么?

 n & 0177

首先,请注意 0177 是八进制输入,类似于二进制 1111111 = 127(十进制)。

但是当你做 n&something 时,应用了默认参数提升,127 被转换为 n 的类型,这意味着,它被转换为类似 0000000 0000000 0000000 01111111 的类型——假设sizeof(typeof(n)) = 4.

因此,n&0177 将转换为仅在 n 为 1 的最低 7 位上保留 1 的数字。

还要注意 bigendian 与 littleendian 的情况。

编译器将前缀 0 解释为基数 8。

所以 177(8) = 127(10) = 1111111(2).

那是你的 7 位。

请注意0177不是十六进制,而是二进制01111111八进制形式。每个八进制数字代表 3 位,前导 0 告诉编译器以这种方式解释它。

所以操作是

decimal 1490    10111010010
octal   0177    00001111111
            AND -----------
decimal 82      00001010010