无法理解按位运算

时间:2020-02-29 10:33:58

标签: c kernighan-and-ritchie

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

按位与运算符&通常用于掩盖某些位集合,例如 n = n&0177; 将除n的低7位以外的所有位都设置为零。

我对它的真实含义有些困惑。十六进制0177如何表示低阶7位?我尝试在代码中对其进行测试,以下是我的工作:

#include <stdio.h>

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

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

3 个答案:

答案 0 :(得分:1)

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

所以操作是

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

答案 1 :(得分:0)

 n & 0177

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

但是当您执行n&something时,将应用默认参数Promotions,并且127转换为n的类型,这意味着它将转换为类似0000000 0000000 0000000 01111111的类型-假设{{ 1}}。

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

还要注意bigendian和littleendian的情况。

答案 2 :(得分:0)

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

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

那是您的7位。

相关问题