计算机位运算知识点

计算机位运算知识点汇总

计算机位运算知识点汇总

通俗易懂的位运算指南 – 深入理解计算机底层的数据操作

位运算是直接操作二进制位的运算方式,是计算机最底层的操作。它们通常比算术运算更快,因为计算机硬件可以直接执行这些操作。

在编程中,位运算常用于优化性能、处理标志位、数据压缩、加密等领域。本指南将通过易懂的解释、可视化示例和实际应用场景帮助你掌握位运算的核心知识点。

🔢 1. 二进制基础

计算机中使用二进制(0和1)表示所有数据,每个0或1称为一个位(bit)

位(Bit)

是计算机中最小的数据单位,只能表示0或1两种状态。

字节(Byte)

8个位组成1个字节,可以表示256种不同的值(2^8)。

// 一个字节的二进制表示(8位)
十进制 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,说明是偶数
}

常见用途:清零特定位、取指定位、判断奇偶

🔀 3. 按位或(OR)

符号:|

规则:两个位中只要有一个为1,结果就为1。

1
0
1
0
|
1
1
0
0
=
1
1
1
0
// 实际应用:设置特定位
// 将数字的第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

常见用途:翻转特定位、交换值、简单加密

🔄 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

注意:取反操作会将所有位翻转,包括符号位

⏩ 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

常见用途:快速乘以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)

常见用途:快速除以2的幂、提取特定位

🚀 位运算的实际应用

🔐 权限系统

使用位掩码管理权限组合:

const READ = 1; // 0001
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;

⚡ 性能优化

代替部分乘除运算:

// 乘以2的n次方
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;
}

位运算总结:掌握这些底层操作有助于编写更高效的代码,理解计算机工作原理!

记住:多练习、多思考,位运算会变得简单而强大!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部