位运算
2025年7月6日大约 2 分钟
位运算
运算符 | 名称 | 含义 | 示例(十进制) | 说明 | |||
---|---|---|---|---|---|---|---|
<< | 左移 | 将二进制向左移动若干位,相当于乘以 2^n | 3 << 2 = 12 | 左移2位,3变成12 | |||
>> | 右移 | 将二进制向右移动若干位,相当于除以 2^n | 12 >> 2 = 3 | 右移2位,12变成3 | |||
>>> | 无符号右移 | 右移时最高位补0,忽略符号位 | 负数右移时区别较大 | 通常对负数做无符号右移用 | |||
& | 按位与 | 两位都是1则结果为1,否则为0 | 6 & 3 = 2 | 0110 & 0011 = 0010 | |||
| | 按位或 | 两位有1则结果为1,否则为0 | 6 | 3 = 7 | 0110 | 0011 = 0111 | |||
^ | 按位异或 | 两位不同为1,相同为0 | 6 ^ 3 = 5 | 0110 ^ 0011 = 0101 | |||
~ | 按位取反 | 0变1,1变0 | ~6 = -7 | 取反后是补码形式 |
✅ 速记点 1:十进制转非十进制
🌟 口诀: 整数部分:除 N 取余倒序排;小数部分:乘 N 取整顺序记
✳️ 整数部分:除基数(N)取余数 → 倒序输出
以 十进制 156 转二进制
为例:
156 ÷ 2 = 78 余 0
78 ÷ 2 = 39 余 0
39 ÷ 2 = 19 余 1
19 ÷ 2 = 9 余 1
9 ÷ 2 = 4 余 1
4 ÷ 2 = 2 余 0
2 ÷ 2 = 1 余 0
1 ÷ 2 = 0 余 1 ✅停
倒着写余数:**10011100(二进制)**
✳️ 小数部分:乘基数(N)取整数 → 正序输出
以 十进制 0.625 转二进制
为例:
0.625 × 2 = 1.25 → 整数 1
0.25 × 2 = 0.5 → 整数 0
0.5 × 2 = 1.0 → 整数 1 ✅结束
写出整数部分:**101(二进制)**
→ 所以 0.625 = 0.101(二进制)
✅ 速记点 2:非十进制转十进制
🌟 口诀:每位 × 基数的“位次方”,再求和
✳️ 举例:二进制 1011
转十进制
$$ 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 8 + 0 + 2 + 1 = \boxed{11} $$
✳️ 举例:八进制 157
转十进制
$$ 1 \times 8^2 + 5 \times 8^1 + 7 \times 8^0 = 64 + 40 + 7 = \boxed{111} $$
✅ 速记点 3:二/八/十六进制互转
🌟 口诀: 一位八进制 = 三位二进制一位十六进制 = 四位二进制
✳️ 八进制 ↔ 二进制
八进制 | 二进制 |
---|---|
0 | 000 |
1 | 001 |
2 | 010 |
7 | 111 |
举例:八进制 75
→ 分别转换:7 = 111, 5 = 101 → 所以是二进制:111101
✳️ 十六进制 ↔ 二进制
十六进制 | 二进制 |
---|---|
A | 1010 |
B | 1011 |
C | 1100 |
F | 1111 |
举例:十六进制 2F
→ 2 = 0010,F = 1111 → 所以是二进制:00101111
✅ 总结整合口诀(超简)
操作 | 口诀 |
---|---|
十转其他 | 整数除基取余倒写,小数乘基取整顺写 |
其他转十 | 每位 × 基数^位置,累加求和 |
八 ↔ 二 | 1 位八进制 = 3 位二进制 |
十六 ↔ 二 | 1 位十六进制 = 4 位二进制 |
颠倒二进制位 - LeetCode 190
class Solution {
public int reverseBits(int n) {
int ans = 0;
for (int i = 0; i < 32; i++) { // 32位
ans = (ans << 1) | (n & 1); // 把n的最低位加到ans的最低位
n >>= 1; // 把n右移一位
}
return ans;
}
}