无法理解位运算
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
阅读 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