[英]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.