位运算符:
- 按位与 (
&
)
int a = 6; // 0110 in binary int b = 3; // 0011 in binary int c = a & b; // 结果为 2 (0010),因为对应位置都为1才为1
- 按位或 (
|
)
int a = 6; int b = 3; int c = a | b; // 结果为 7 (0111),因为任一位置有1则结果为1
- 按位异或 (
^
)
int a = 6; int b = 3; int c = a ^ b; // 结果为 5 (0101),因为对应位置不同时结果为1
- 按位取反 (
~
)
int a = 6; int c = ~a; // 结果为 -7 (…1101),对整个二进制位取反(包括符号位)
- 左移 (
<<
)
int a = 1; // 00000001 int b = a << 2; // 结果为 4 (00000100),a 向左移动两位
- 右移 (
>>
)
int a = 8; // 00001000 signed int b = a >> 1; // 结果为 4 (对于有符号数,最高位决定符号,这里是正数,所以右移后保留符号位) unsigned int c = a >> 1; // 对于无符号数,结果也是 4 (00000100)
- C++标准库并没有内置大量的位运算函数,但某些编译器提供了扩展函数,例如:
__builtin_popcount()
:计算给定整数中“1”的个数(比特数)。__builtin_clz()
或__builtin_ctz()
:分别计算给定整数中最高置零位的位置(从最左边开始计数,不包括符号位)或最低置位的位置(从最右边开始计数)。
- 标准库中,
std::bitset
类可以用于更高级别的位操作,比如按位逻辑运算、获取和设置单个位等。
应用场景:
- 优化程序性能:位运算可以直接在硬件层面执行,因此在一些场合下它们比常规算术运算更快。
- 布尔操作:用来模拟简单的布尔逻辑表达式。
- 掩码操作:用于访问和修改特定位,常用于网络编程、图形处理等领域。
- 压缩数据结构:通过位字段来存储多个布尔状态,节省空间。
注意事项:
- 位运算符的操作数通常是整型(包括但不限于
int
、unsigned int
、char
等)。 - 左移和右移可能会导致溢出,尤其是在处理有符号整数时,右移的符号扩展行为应当注意。
- 使用位运算时应考虑数据类型的大小,特别是跨平台编程时,不同平台上整型的大小可能不同。
std::bitset的举例说明
#include <bitset> #include <iostream> int main() { using namespace std; // 定义一个包含16位的bitset bitset<16> bs; // 初始化bitset bs = bitset<16>(0xFFFF); // 全部位设为1 cout << "Initialized Bitset: " << bs << endl; // 设置指定位置的位为1 bs.set(3); // 第4位(从0开始计数)设为1 cout << "After setting the 4th bit to 1: " << bs << endl; // 获取指定位置的位 bool fourthBit = bs.test(3); cout << "The value of the 4th bit is: " << fourthBit << endl; // 按位逻辑运算 bitset<16> bs1(0b10101010); bitset<16> bs2(0b11001100); bitset<16> resultAnd = bs1 & bs2; // 按位与 bitset<16> resultOr = bs1 | bs2; // 按位或 bitset<16> resultXor = bs1 ^ bs2; // 按位异或 // 输出bitset cout << "Original Bitset 1: " << bs1 << endl; cout << "Original Bitset 2: " << bs2 << endl; cout << "AND Operation: " << resultAnd << endl; cout << "OR Operation: " << resultOr << endl; cout << "XOR Operation: " << resultXor << endl; // 重置指定位置的位为0 bs.reset(3); // 第4位设为0 cout << "After resetting the 4th bit to 0: " << bs << endl; // 翻转指定位置的位 bs.flip(3); // 第4位翻转(0变1,1变0) cout << "After flipping the 4th bit: " << bs << endl; // 读取bitset的字符串形式 string bitString = bs.to_string(); // 得到一个包含bitset所有位的字符串形式 cout << "Bitset as a string: " << bitString << endl; // 从整数初始化bitset bitset<16> fromInt(bs.to_ulong()); // 从bs转换成的无符号长整型重新创建bitset cout << "Recreated Bitset from integer: " << fromInt << endl; // 输出bitset大小 size_t size = bs.size(); cout << "Bitset size: " << size << endl; // (注:这里的cin >> bs 和 cout << bs 示例仅适用于交互式环境,在实际运行中可能无法看到效果) // 输入和输出bitset(需要重载流操作符) // cin >> bs; // 输入一个bitset // cout << bs; // 输出一个bitset return 0; }
Initialized Bitset: 1111111111111111 2After setting the 4th bit to 1: 1111111111111011 3The value of the 4th bit is: 1 4Original Bitset 1: 10101010 5Original Bitset 2: 11001100 6AND Operation: 10001000 7OR Operation: 11101110 8XOR Operation: 01100110 9After resetting the 4th bit to 0: 1111111111111001 10After flipping the 4th bit: 1111111111111011 11Bitset as a string: 1111111111111011 12Recreated Bitset from integer: 1111111111111011 13Bitset size: 16