Skip to content

L3_03 位运算

一、与运算 (&)

1.1 定义

两个位都为 1 时结果为 1,否则为 0。

1.2 真值表

ABA & B
000
010
100
111

1.3 示例

cpp
#include <iostream>
using namespace std;

int main() {
    int a = 5;   // 0101
    int b = 3;   // 0011
    
    cout << (a & b) << endl;  // 0001 = 1
    return 0;
}

1.4 常用用途

  • 检查特定位是否为 1
  • 清除特定位

二、或运算 (|)

2.1 定义

两个位中有一个为 1 时结果为 1。

2.2 真值表

ABA | B
000
011
101
111

2.3 示例

cpp
#include <iostream>
using namespace std;

int main() {
    int a = 5;   // 0101
    int b = 3;   // 0011
    
    cout << (a | b) << endl;  // 0111 = 7
    return 0;
}

2.4 常用用途

  • 设置特定位为 1

三、非运算 (~)

3.1 定义

对每一位取反。

3.2 真值表

A~A
01
10

3.3 示例

cpp
#include <iostream>
using namespace std;

int main() {
    int a = 5;   // 0000 0101
    
    cout << (~a) << endl;  // 1111 1010(补码表示为 -6)
    return 0;
}

四、异或运算 (^)

4.1 定义

两个位不同时结果为 1,相同时为 0。

4.2 真值表

ABA ^ B
000
011
101
110

4.3 示例

cpp
#include <iostream>
using namespace std;

int main() {
    int a = 5;   // 0101
    int b = 3;   // 0011
    
    cout << (a ^ b) << endl;  // 0110 = 6
    return 0;
}

4.4 常用用途

  • 交换两个变量(不使用临时变量)
  • 翻转特定位

五、左移运算 (<<)

5.1 定义

将所有位向左移动指定位数,右边补 0。

5.2 示例

cpp
#include <iostream>
using namespace std;

int main() {
    int a = 5;   // 0101
    
    cout << (a << 1) << endl;  // 1010 = 10
    cout << (a << 2) << endl;  // 10100 = 20
    return 0;
}

5.3 性质

  • 左移 n 位相当于乘以 2^n

六、右移运算 (>>)

6.1 定义

将所有位向右移动指定位数。

6.2 示例

cpp
#include <iostream>
using namespace std;

int main() {
    int a = 10;   // 1010
    
    cout << (a >> 1) << endl;  // 0101 = 5
    cout << (a >> 2) << endl;  // 0010 = 2
    return 0;
}

6.3 性质

  • 右移 n 位相当于除以 2^n(向下取整)

七、位运算应用

7.1 判断奇偶性

cpp
bool isOdd(int num) {
    return (num & 1) == 1;
}

7.2 交换两个变量

cpp
void swap(int &a, int &b) {
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

7.3 计算绝对值

cpp
int abs(int num) {
    int mask = num >> 31;
    return (num ^ mask) - mask;
}

7.4 统计二进制中 1 的个数

cpp
int countOnes(int num) {
    int count = 0;
    while (num) {
        num &= (num - 1);
        count++;
    }
    return count;
}

百炼成钢,融会贯通