假设我有变量 x
初始化为 425
.在二进制中,即110101001
.
将其向右移动 2 位,如下所示:int a = x >> 2;
,答案是:106
.在二进制中是 1101010
.这是有道理的,因为最右边的两个位被丢弃,两个零被添加到左侧。
将其向左移动 2 位,如下所示:int a = x << 2;
,答案是:1700
.在二进制中,这是 11010100100
.我不明白这是怎么回事。为什么保留最左边的两位?我怎样才能放下它们?
谢谢,
最佳答案
这是因为 int
在您的系统上可能是 32 位的。 (假设 x 是 int
类型。)
所以你的 425
实际上是:
0000 0000 0000 0000 0000 0001 1010 1001
当左移 2 位时,您会得到:
0000 0000 0000 0000 0000 0110 1010 0100
直到你一直超过 32 之前,什么都不会被转移。(严格来说,有符号整数的溢出是 C/C++ 中的未定义行为。)
要删除被移出的位,您需要对作为数字原始长度的掩码进行按位与操作:
int a = (425 << 2) & 0x1ff; // 0x1ff is for 9 bits as the original length of the number.
关于c - 按位移位说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088315/