C++中的位运算符

简介: C++中的位运算符

位运算符:

  1. 按位与 (&)
int a = 6; // 0110 in binary
int b = 3; // 0011 in binary
int c = a & b; // 结果为 2 (0010),因为对应位置都为1才为1
  1. 按位或 (|)
int a = 6;
int b = 3;
int c = a | b; // 结果为 7 (0111),因为任一位置有1则结果为1
  1. 按位异或 (^)
int a = 6;
int b = 3;
int c = a ^ b; // 结果为 5 (0101),因为对应位置不同时结果为1
  1. 按位取反 (~)
int a = 6;
int c = ~a; // 结果为 -7 (…1101),对整个二进制位取反(包括符号位)
  1. 左移 (<<)
int a = 1; // 00000001
int b = a << 2; // 结果为 4 (00000100),a 向左移动两位
  1. 右移 (>>)
int a = 8; // 00001000
signed int b = a >> 1; // 结果为 4 (对于有符号数,最高位决定符号,这里是正数,所以右移后保留符号位)
unsigned int c = a >> 1; // 对于无符号数,结果也是 4 (00000100)
  1. 特殊位运算函数:
  • 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


目录
相关文章
|
9月前
|
数据安全/隐私保护 C++
在C++语言中位运算符
在C++语言中位运算符
68 0
|
23天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
63 19
|
23天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
42 13
|
23天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
46 5
|
23天前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
36 5
|
23天前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
44 4
|
23天前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
31 3
|
3月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
84 2
|
3月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
146 5