1. 什么是“二进制”?
在计算机中,所有数字都是用二进制表示的。二进制只有两个数字:0
和 1
。
- 例子:
- 十进制的
5
在二进制中是00000101
。 - 每一位代表一个“开关”,
1
表示开,0
表示关。
- 十进制的
简单来说,二进制就是用 0
和 1
来表示数字的一种方式。
2. 什么是“向左移动 5 位”?
- 向左移动:把二进制数的所有位向左移动一定的位数。
- 补零:空出来的右边位置用
0
填充。 - 例子:
- 原始数字:
00000101
(十进制的5
)。 - 左移 5 位:
10100000
(十进制的160
)。
- 原始数字:
3. 这个机制包含哪些部分?
- 二进制表示:将数字转换为二进制形式。
- 位移操作:将每一位向左移动。
- 补零操作:空出来的右边位置用
0
填充。 - 结果转换:将新的二进制数转换回十进制。
4. 背后到底做了哪些事情?
当你执行 00000101 << 5
时,计算机会在背后做以下事情:
- 读取二进制:原始数字
5
的二进制是00000101
。 - 向左移动:将每一位向左移动 5 位。
- 移动前:
00000101
- 移动后:
10100000
- 移动前:
- 补零:空出来的右边位置用
0
填充。 - 转换为十进制:新的二进制数
10100000
对应十进制的160
。
5. 使用场景是什么?
- 快速计算:位移操作比直接乘法更快,因为它直接操作二进制位。
- 哈希函数:在哈希算法中,位移操作可以快速生成复杂的哈希值。
- 优化性能:在需要大量计算的场景中,位移操作可以提高效率。
6. 底层原理是什么?
计算机以二进制形式存储数据,位移操作是对二进制的直接操作。左移相当于乘以 2 的幂次方,右移相当于除以 2 的幂次方。
- 左移公式:
n << k
等价于 ( n \times 2^k )。 - 右移公式:
n >> k
等价于 ( n \div 2^k )(向下取整)。
7. 实际代码讲解
下面是一个演示位移操作的代码示例,并附有详细注释:
<?php
// 演示左移操作
function leftShiftExample($number, $shift) {
echo "原始数字: $number\n";
echo "二进制表示: " . decbin($number) . "\n"; // 将数字转换为二进制
$result = $number << $shift; // 左移操作
echo "左移 $shift 位后的结果: $result\n";
echo "左移后的二进制表示: " . decbin($result) . "\n";
}
// 测试代码
leftShiftExample(5, 5); // 左移 5 位
注释详解
decbin($number)
:将数字转换为二进制字符串,方便观察位移效果。$number << $shift
:执行左移操作。- 每左移一位,数字会翻倍。
- 左移 5 位相当于乘以 (2^5 = 32)。
- 输出结果:展示原始数字、二进制表示、左移后的结果和二进制表示。
8. 图示与思维导图
思维导图
左移操作 (<<)
├── 输入
│ └── 数字 (Number)
├── 处理
│ ├── 读取二进制
│ ├── 左移位数
│ └── 补 0
└── 输出
└── 新数字 (Result)
流程图
输入数字 -> 转换为二进制 -> 左移指定位数 -> 补 0 -> 转换回十进制 -> 输出结果
示意图
原始数字 5 的二进制:00000101
左移 5 位后: 10100000
对应十进制: 160
UML 类图
+-------------------+
| LeftShiftDemo |
+-------------------+
| + leftShiftExample|
| (number, shift) |
+-------------------+
9. 总结
通过以上内容,我们可以看到“00000101
向左移动 5 位变成 10100000
”是如何工作的。它就像一个魔法工具,通过移动二进制位来快速计算乘法。