c - 按位移位说明

标签 c binary bit-manipulation bit-shift

假设我有变量 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/

相关文章:

c - 如何从文本文件中读取最小/最大变量?

c - 错误 - 00352D10 处的堆 block 在 00352D1C 处修改,超过了请求的大小 4

python - C 类型 float、double 和 long 的 Python 等价物是什么?

C# 二进制数组 "{ 84, 01, 00, 00 }"在 Windows 注册表中更改为 "54 01 00 00"

java - 从二进制字符串中获取n位

java - 替换 long 的最后一位数字的最高效(也最安全)的方法是什么?

c - 绑定(bind)()失败: Invalid argument

python - 如何在python中修改文件的二进制状态?

java - 是否可以在 Java 中对 float 执行位操作?

c - 哪种位操作方法在 C 中更有效?