计算机位运算知识点汇总
通俗易懂的位运算指南 – 深入理解计算机底层的数据操作
位运算是直接操作二进制位的运算方式,是计算机最底层的操作。它们通常比算术运算更快,因为计算机硬件可以直接执行这些操作。
在编程中,位运算常用于优化性能、处理标志位、数据压缩、加密等领域。本指南将通过易懂的解释、可视化示例和实际应用场景帮助你掌握位运算的核心知识点。
🔢 1. 二进制基础
计算机中使用二进制(0和1)表示所有数据,每个0或1称为一个位(bit)。
位(Bit)
是计算机中最小的数据单位,只能表示0或1两种状态。
字节(Byte)
8个位组成1个字节,可以表示256种不同的值(2^8)。
// 一个字节的二进制表示(8位)
十进制 5 = 二进制 00000101
十进制 10 = 二进制 00001010
十进制 255 = 二进制 11111111
十进制 5 = 二进制 00000101
十进制 10 = 二进制 00001010
十进制 255 = 二进制 11111111
原码、反码和补码
计算机使用补码表示负数:
- 原码:最高位表示符号(0正1负)
- 反码:正数不变,负数符号位不变、其他位取反
- 补码:正数不变,负数为反码+1(计算机实际使用)
🧩 2. 按位与(AND)
符号:&
规则:两个位都为1时结果才为1,否则为0。
1
0
1
0
&
1
1
0
0
=
1
0
0
0
// 实际应用:检查奇偶性
if (num & 1) {
// 最低位为1,说明是奇数
} else {
// 最低位为0,说明是偶数
}
if (num & 1) {
// 最低位为1,说明是奇数
} else {
// 最低位为0,说明是偶数
}
常见用途:清零特定位、取指定位、判断奇偶
🔀 3. 按位或(OR)
符号:|
规则:两个位中只要有一个为1,结果就为1。
1
0
1
0
|
1
1
0
0
=
1
1
1
0
// 实际应用:设置特定位
// 将数字的第3位设为1(从0开始计数)
int setBit = num | (1 << 2);
// 将数字的第3位设为1(从0开始计数)
int setBit = num | (1 << 2);
常见用途:设置特定位、组合标志位
💫 4. 按位异或(XOR)
符号:^
规则:两个位不同时结果为1,相同时为0。
1
0
1
0
^
1
1
0
0
=
0
1
1
0
// 实际应用:交换两个变量的值(不使用临时变量)
a = a ^ b;
b = a ^ b; // b = a
a = a ^ b; // a = b
a = a ^ b;
b = a ^ b; // b = a
a = a ^ b; // a = b
常见用途:翻转特定位、交换值、简单加密
🔄 5. 按位取反(NOT)
符号:~
规则:将每一位取反,0变1,1变0。
1
0
1
0
~ 运算后
0
1
0
1
// 实际应用:配合AND清除最后一位1
int clearLastBit = num & (num – 1);
// 取反操作
byte a = 5; // 二进制: 00000101
byte b = ~a; // 二进制: 11111010
int clearLastBit = num & (num – 1);
// 取反操作
byte a = 5; // 二进制: 00000101
byte b = ~a; // 二进制: 11111010
注意:取反操作会将所有位翻转,包括符号位
⏩ 6. 左移运算
符号:<<
规则:将所有位向左移动指定的位数,右侧空位补0。
0
0
0
1
0
1
<< 2
0
1
0
1
0
0
// 左移1位相当于乘以2
int a = 5; // 二进制: 0101
int b = a << 1; // 二进制: 1010 (十进制10)
// 左移n位相当于乘以2的n次方
int c = 7 << 3; // 7 * 8 = 56
int a = 5; // 二进制: 0101
int b = a << 1; // 二进制: 1010 (十进制10)
// 左移n位相当于乘以2的n次方
int c = 7 << 3; // 7 * 8 = 56
常见用途:快速乘以2的幂、设置特定位
⏪ 7. 右移运算
符号:>>
规则:将所有位向右移动指定的位数,左侧空位补符号位(算术右移)。
1
0
1
0
1
>> 2
1
1
0
1
0
// 正数右移相当于除以2
int a = 20; // 二进制: 10100
int b = a >> 2; // 二进制: 00101 (十进制5)
// 负数右移(保留符号)
int c = -8; // 二进制: 1111…1000
int d = c >> 1; // 二进制: 1111…1100 (十进制-4)
int a = 20; // 二进制: 10100
int b = a >> 2; // 二进制: 00101 (十进制5)
// 负数右移(保留符号)
int c = -8; // 二进制: 1111…1000
int d = c >> 1; // 二进制: 1111…1100 (十进制-4)
常见用途:快速除以2的幂、提取特定位
🚀 位运算的实际应用
🔐 权限系统
使用位掩码管理权限组合:
const READ = 1; // 0001
const WRITE = 2; // 0010
const EXEC = 4; // 0100
// 授予权限
let userPerm = READ | WRITE; // 0011
// 检查权限
if (userPerm & READ) { … }
const WRITE = 2; // 0010
const EXEC = 4; // 0100
// 授予权限
let userPerm = READ | WRITE; // 0011
// 检查权限
if (userPerm & READ) { … }
🎨 颜色操作
提取和组合RGB颜色分量:
let color = 0xFF3366; // RGB颜色
// 提取红色分量
let r = (color >> 16) & 0xFF;
// 提取绿色分量
let g = (color >> 8) & 0xFF;
// 组合颜色
let newColor = (r << 16) | (g << 8) | b;
// 提取红色分量
let r = (color >> 16) & 0xFF;
// 提取绿色分量
let g = (color >> 8) & 0xFF;
// 组合颜色
let newColor = (r << 16) | (g << 8) | b;
⚡ 性能优化
代替部分乘除运算:
// 乘以2的n次方
int fastMultiply = num << n;
// 除以2的n次方
int fastDivide = num >> n;
// 判断是否为2的幂
bool isPowerOfTwo = (n & (n-1)) == 0;
int fastMultiply = num << n;
// 除以2的n次方
int fastDivide = num >> n;
// 判断是否为2的幂
bool isPowerOfTwo = (n & (n-1)) == 0;
🧮 高效算法
位运算在算法中的妙用:
// 统计二进制中1的个数
int countBits(int n) {
int count = 0;
while (n) {
n &= (n – 1);
count++;
}
return count;
}
int countBits(int n) {
int count = 0;
while (n) {
n &= (n – 1);
count++;
}
return count;
}