在阅读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)运算符,但是得出的数字却完全不同。我在做什么错了?
答案 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位。