一、位运算概念
计算机唯一识别的数据的二进制数据,计算机中所有数据都以二进制形式存储,即 0 和 1 两种状态。计算机对二进制数据进行的运算(算数运算、逻辑运算等)被称为位运算,即对二进制数的每一位进行操作的运算。
二、位运算符号
|----------|----------|---------------------------|
| 运算符 | 作用 | 说明 |
| & | 按位与 | 两个操作数同时为1,结果为1 |
| | | 按位或 | 两个操作数同时为0,结果为0 |
| ~ | 按位非 | 操作数为1,结果为0;操作数为0,结果为1 |
| ^ | 按位异或 | 两个操作数相同,结果为0;不相同结果为1 |
| << | 左移 | 右侧空位补0 |
| >> | 右移 | 左侧空位补符号位 |
按位与的用途:需要清零的位与0进行与操作;需要保留的某些位与1进行与操作。
按位或的用途:将置1的某些位与1进行或,需要保持的某些位与0进行或。
三、代码解析
cpp
#include <iostream>
#include <iomanip> // 仅用于格式化二进制输出,无额外子函数
using namespace std;
int main() {
cout << "=== 基础位运算示例 ===" << endl;
int a = 6; // 二进制:00000110
int b = 10; // 二进制:00001010
// 1. 按位与 &
int andResult = a & b; // 00000010 → 2
cout << "a & b = " << andResult << " ";
for (int i = 7; i >= 0; i--)
cout << ((andResult >> i) & 1);
cout << endl;
// 2. 按位或 |
int orResult = a | b; // 00001110 → 14
cout << "a | b = " << orResult << " ";
for (int i = 7; i >= 0; i--)
cout << ((orResult >> i) & 1);
cout << endl;
// 3. 按位异或 ^
int xorResult = a ^ b; // 00001100 → 12
cout << "a ^ b = " << xorResult << " ";
for (int i = 7; i >= 0; i--)
cout << ((xorResult >> i) & 1);
cout << endl;
// 4. 按位取反 ~(仅显示低8位)
int notResult = ~a;
cout << "~a = " << notResult << " ";
for (int i = 7; i >= 0; i--)
cout << (((unsigned int)notResult & 0xFF) >> i & 1);
cout << endl;
// 5. 左移 <<
int leftShift = a << 2; // 00011000 → 24
cout << "a << 2 = " << leftShift << " ";
for (int i = 7; i >= 0; i--)
cout << ((leftShift >> i) & 1);
cout << endl;
// 6. 右移 >>
int rightShift = b >> 1; // 00000101 → 5
cout << "b >> 1 = " << rightShift << " ";
for (int i = 7; i >= 0; i--)
cout << ((rightShift >> i) & 1);
cout << "\n=====================" << endl;
// ===================== 第二部分:位运算实用技巧 =====================
// 技巧1:判断奇偶
int num1 = 15, num2 = 16;
cout << num1 << " 是" << ((num1 & 1) ? "奇数" : "偶数") << endl;
cout << num2 << " 是" << ((num2 & 1) ? "奇数" : "偶数") << endl;
// 技巧2:交换两个数(无需临时变量)
int x = 8, y = 12;
cout << "\n交换前:x=" << x << ", y=" << y << endl;
x = x ^ y;
y = x ^ y;
x = x ^ y;
cout << "交换后:x=" << x << ", y=" << y << endl;
// 技巧3:将某一位置1(第3位,从0计数)
int val = 5; // 00000101
int bitPos = 3;
val |= (1 << bitPos); // 00001101 → 13
cout << "\n将第" << bitPos << "位置1后:" << val << endl;
// 技巧4:将某一位清零(第2位)
val = 13; // 00001101
bitPos = 2;
val &= ~(1 << bitPos); // 00001001 → 9
cout << "将第" << bitPos << "位清零后:" << val << endl;
// 技巧5:判断某一位是否为1(第1位)
val = 9; // 00001001
bitPos = 1;
bool is1 = (val & (1 << bitPos)) != 0;
cout << "第" << bitPos << "位是" << (is1 ? "1" : "0") << endl;
// 技巧6:快速计算2的n次方
bitPos = 5;
int pow2 = 1 << bitPos; // 32
cout << "2^" << bitPos << " = " << pow2 << endl;
return 0;
}