C++中的位运算符

发布于:2024-05-04 ⋅ 阅读:(36) ⋅ 点赞:(0)

位运算符:

  1. 按位与 (&)

    int a = 6; // 0110 in binary
    int b = 3; // 0011 in binary
    int c = a & b; // 结果为 2 (0010),因为对应位置都为1才为1
  2. 按位或 (|)

    int a = 6;
    int b = 3;
    int c = a | b; // 结果为 7 (0111),因为任一位置有1则结果为1
  3. 按位异或 (^)

    int a = 6;
    int b = 3;
    int c = a ^ b; // 结果为 5 (0101),因为对应位置不同时结果为1
  4. 按位取反 (~)

    int a = 6;
    int c = ~a; // 结果为 -7 (…1101),对整个二进制位取反(包括符号位)
  5. 左移 (<<)

    int a = 1; // 00000001
    int b = a << 2; // 结果为 4 (00000100),a 向左移动两位
  6. 右移 (>>)

    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 类可以用于更高级别的位操作,比如按位逻辑运算、获取和设置单个位等。

应用场景:

  • 优化程序性能:位运算可以直接在硬件层面执行,因此在一些场合下它们比常规算术运算更快。
  • 布尔操作:用来模拟简单的布尔逻辑表达式
  • 掩码操作:用于访问和修改特定位,常用于网络编程、图形处理等领域。
  • 压缩数据结构:通过位字段来存储多个布尔状态,节省空间。

注意事项:

  • 位运算符的操作数通常是整型(包括但不限于intunsigned intchar等)。
  • 左移和右移可能会导致溢出,尤其是在处理有符号整数时,右移的符号扩展行为应当注意。
  • 使用位运算时应考虑数据类型的大小,特别是跨平台编程时,不同平台上整型的大小可能不同。

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

网站公告

今日签到

点亮在社区的每一天
去签到