繁体   English   中英

按位移位澄清

[英]Bitwise Shift Clarification

假设我将变量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.

首先,请不要移位有符号整数。 对于无符号整数类型,按位运算通常是唯一明确的。

其次,如果可以使用* 4/ 4 ,为什么还要平移?

第三,仅当超出类型大小时,才在左侧丢弃位。 如果要在数学上“在左侧截断”,请执行模运算:

(x * 4) % 256

按位等效为与(AND),具有以下位模式: (x << 2) & 0xFF

(也就是说,C中的基本无符号整数类型始终隐式为“模2 n ”,其中n是该类型的位数。)

您为什么期望它们被丢弃? 您的int(可能)消耗4个字节。 您正在将它们转移到正确占用的空间中。

评估期间将占用存储器中的整个4字节空间。 您需要完全移出内存中的该空间以“删除”它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM