什么是位移?
位移(bit shift)是指把一个整数的二进制位向左或向右移动指定的位数。它是编程中的基础运算,广泛应用于底层性能优化、图形处理、哈希算法和嵌入式开发等场景。左移(n << k)会把所有二进制位往高位方向移动,低位用 0 补齐;而右移(n >> k)则把二进制位往低位方向移动。
如何使用本计算器
输入整数 n、移动的位数 k,再选择移动方向,计算器即可给出运算后的十进制结果。本工具采用 64 位有符号整数运算,与大多数编程语言的行为保持一致。
公式详解
每向左移动一位,数值就会翻一倍,因此左移 \(k\) 位相当于乘以 \(2^{k}\):
$$\text{Result} = \text{Number (n)} \ll \text{Shift (k)} = n \times 2^{k}$$每向右移动一位,数值就会减半并向下取整,因此右移 \(k\) 位相当于对 \(2^{k}\) 做整数除法:
$$\text{Result} = \text{Number (n)} \gg \text{Shift (k)} = \left\lfloor \frac{n}{2^{k}} \right\rfloor$$正因如此,在硬件层面位移运算的开销远低于乘法和除法。
实例演示
以 \(n = 16\)、左移 \(k = 2\) 为例。16 的二进制是 10000,左移两位就是在末尾补上两个 0,得到 1000000,即 64。用算式表示就是 $$16 \times 2^{2} = 16 \times 4 = 64$$ 反过来,$$64 \gg 2 = \left\lfloor \frac{64}{4} \right\rfloor = 16$$ 又回到了原始数值。
二的幂次参考表
左移\(k\)位将一个数乘以\(2^k\);右移\(k\)位除以\(2^k\)(整数舍弃余数)。使用此表可立即读出给定移位数量的乘数或除数。
| 移位 \(k\) | \(2^k\)(十进制) | \(\ll k\) / \(\gg k\)的含义 |
|---|---|---|
| 0 | 1 | 无变化 |
| 1 | 2 | \(\times 2\) / \(\div 2\) |
| 2 | 4 | \(\times 4\) / \(\div 4\) |
| 3 | 8 | \(\times 8\) / \(\div 8\) |
| 4 | 16 | \(\times 16\) |
| 5 | 32 | \(\times 32\) |
| 6 | 64 | \(\times 64\) |
| 7 | 128 | \(\times 128\) |
| 8 | 256 | \(\times 256\)(1字节) |
| 9 | 512 | \(\times 512\) |
| 10 | 1,024 | \(\times 1024\)(1 KiB) |
| 11 | 2,048 | \(\times 2048\) |
| 12 | 4,096 | \(\times 4096\) |
| 13 | 8,192 | \(\times 8192\) |
| 14 | 16,384 | \(\times 16384\) |
| 15 | 32,768 | \(\times 32768\) |
| 16 | 65,536 | \(\times 65536\)(2字节) |
| 17 | 131,072 | |
| 18 | 262,144 | |
| 19 | 524,288 | |
| 20 | 1,048,576 | \(\times\) 1 MiB |
| 32 | 4,294,967,296 | 32位边界 |
| 63 | 9,223,372,036,854,775,808 | 64位有符号整数的最高位 |
常见问题
左移会丢失数据吗? 会。超出整数位宽的二进制位会被丢弃(溢出)。在 64 位范围内,本计算器能完整保留数值。
负数右移会怎样? 本计算器采用算术(有符号)右移,会保留符号位,因此负数右移后仍然是负数。
为什么用位移代替乘除? 在大多数 CPU 上,位移是单周期运算,因此用它来乘以或除以 2 的幂运算速度非常快。