位移计算器
对整数执行左移、逻辑右移和算术右移,并以二进制、十进制和十六进制显示结果。
输入数字,选择移位类型和位数,即可立即查看三种数制下的移位结果。
位移计算器
对整数执行左移、逻辑右移和算术右移,并以二进制、十进制和十六进制显示结果。
将各位向左移动 n 位。等同于把数字乘以 2ⁿ。右侧空出的位补 0。
关于位移
位移是计算机编程和数字硬件设计中最基础的运算之一。位移会把二进制数中的所有位向左或向右移动指定的位数,并丢弃从一端移出的位,同时根据位移类型在另一端补入相应的位。
左移运算符(<<)会将所有位向左移动 n 位。移出左侧的 n 位会被丢弃,右侧补上 n 个 0。左移 n 位在数学上等同于把整数乘以 2ⁿ,只要不会溢出。例如,5(二进制 101)左移 2 位得到 20(二进制 10100),因为 5 × 4 = 20。编译器常常会用左移来替代 2 的幂次乘法,因为它通常只需一个 CPU 时钟周期就能完成。
逻辑右移(>>>)会将所有位向右移动 n 位。移出右侧的 n 位会被丢弃,左侧补上 n 个 0。这会把数字视为无符号数,并等同于除以 2ⁿ 后向下取整。例如,40(二进制 101000)逻辑右移 3 位得到 5(二进制 000101)。在 Java 等语言中,无符号整数的标准操作就是逻辑右移,因此会显式使用 >>>。
算术右移(>>)同样会将位向右移动 n 位,但它不会在左侧补 0,而是复制符号位——最高位。对于正数(符号位为 0),它会补 0,行为与逻辑右移相同。对于负数(在二进制补码中符号位为 1),它会补 1,从而保留负号。例如,−16(32 位补码:...11110000)算术右移 2 位得到 −4(二进制 ...11111100)。这会保持数字的符号,并等同于有符号整数除以 2ⁿ 后向负无穷取整。
位移在性能敏感的代码中被广泛使用。哈希函数、密码学算法、图像处理、音频编码和网络协议解析都依赖位移来提高效率。在硬件中,移位寄存器是基础电路,是串行通信协议、CRC 生成器以及用于随机数生成和数据扰码的线性反馈移位寄存器(LFSR)的基础。
位移示例
常见的移位操作,展示移位与乘除以 2 的幂之间的关系。
| 操作 | 二进制结果 | 十进制校验 |
|---|---|---|
| 5 << 2(左移 2 位) | 10100 | 5 × 4 = 20 ✓。左移 2 位等同于乘以 2² = 4。 |
| 40 >>> 3(逻辑右移 3 位) | 101 | 40 ÷ 8 = 5 ✓。逻辑右移 3 位等同于无符号除以 2³ = 8。 |
| −16 >> 2(算术右移 2 位) | 11111100(−4) | −16 ÷ 4 = −4 ✓。算术移位会保留符号位,因此结果仍为负数。 |
| 二进制 1010 << 1(左移 1 位) | 10100 | 二进制 1010(十进制 10)变为 10100(十进制 20)。左移 1 位会使数值翻倍。 |
如何使用位移计算器
- 选择输入格式:选“十进制”可输入十进制整数(允许负数),选“二进制”可输入二进制字符串。
- 在输入框中输入数字。若选择二进制输入,请只使用 0 和 1。
- 选择移位类型:“左移(<<)”表示乘以 2 的幂,“逻辑右移(>>>)”用于无符号除法,“算术右移(>>)”用于有符号除法。
- 输入移位位数——即要移动的比特数(0 到 31)。
- 点击“计算位移”。结果会以二进制、十进制和十六进制显示。
位移计算器常见问题
逻辑右移和算术右移有什么区别?
逻辑右移会始终在左侧补 0,因此会把操作数视为无符号数。算术右移会在左侧补上符号位的拷贝——正数补 0,负数在二进制补码中补 1。对于非负数,这两种操作的结果相同;只有在操作数为负数时才会不同。在 C/C++ 中,带符号类型上的 >> 运算符在大多数架构上执行的是算术右移。
为什么左移等于乘以 2 的幂?
在二进制中,每个比特位都代表 2 的幂。把所有位向左移动一位,就会让每一位的权重翻倍,因此整个数值也翻倍。左移 n 位就是乘以 2ⁿ。例如,6(二进制 110)左移 3 位得到 110000₂ = 48,而 6 × 8 = 48。编译器会利用这一点,用更便宜的移位指令替代代价更高的乘法指令,只要乘数是 2 的幂次常量。
位移移出边界的比特会怎样?
超出寄存器宽度的比特会被直接丢弃。对于左移,超出寄存器宽度的高位会被丢掉,因此如果结果大到无法放入目标类型,可能会出现意外结果。对于右移,越过 0 位的低位会被丢弃,这等同于向零截断(逻辑右移)或向负无穷取整(算术右移)。
可以用位移做除法吗?
可以。逻辑右移 n 位会把无符号整数除以 2ⁿ(并截断小数部分)。算术右移 n 位会把有符号整数除以 2ⁿ,并向负无穷取整。这和 C 语言对负数的整数除法并不相同:−7 >> 1 = −4(算术右移),但 −7 / 2 = −3(C 会向零截断)。请根据需要选择向下取整还是截断。
最大移位位数是多少?
对于 32 位整数,位移 32 位或更多在 C/C++ 中属于未定义行为,而在硬件中通常会按 32 取模处理(移位 n 位等同于移位 n mod 32 位)。本计算器支持 0 到 31 位的移位,覆盖完整的 32 位范围。若要处理更大的移位,就需要使用多字运算或 64 位整数类型。
位移在真实程序中如何使用?
位移广泛用于各种场景。整数中的位字段打包和拆包(网络报文头、像素颜色通道)、按 2 的幂进行快速乘除、计算哈希值、实现 AES 和 SHA 等密码学原语、从更大的字中提取半字节和字节,以及计算位掩码,都是常见用途。只要程序需要隔离或设置特定位,位移和按位与/或就是首选工具。