【C++】位运算bitset

2024-08-26 11:18
文章标签 c++ 运算 bitset

本文主要是介绍【C++】位运算bitset,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++ 位运算学习笔记

1. 位运算的基本概念

  • 作用:位运算是对整数在二进制表示下的操作,包括按位与、按位或、按位异或、左移、右移等操作。
  • 优势:位运算可以高效地进行一些数值操作,如位掩码、位计数等,提高程序的执行效率。
  • 发展历程:位运算是计算机科学中的基础概念之一,在计算机领域有着广泛的应用。

示例代码

#include <iostream>int main() {int a = 5; // 二进制表示为 0000 0101int b = 3; // 二进制表示为 0000 0011// 按位与(&)int result_and = a & b; // 0000 0001(二进制)= 1(十进制)std::cout << "Bitwise AND: " << result_and << std::endl;// 按位或(|)int result_or = a | b; // 0000 0111(二进制)= 7(十进制)std::cout << "Bitwise OR: " << result_or << std::endl;// 按位异或(^)int result_xor = a ^ b; // 0000 0110(二进制)= 6(十进制)std::cout << "Bitwise XOR: " << result_xor << std::endl;// 左移(<<)int result_left_shift = a << 1; // 0000 1010(二进制)= 10(十进制)std::cout << "Left shift: " << result_left_shift << std::endl;// 右移(>>)int result_right_shift = a >> 1; // 0000 0010(二进制)= 2(十进制)std::cout << "Right shift: " << result_right_shift << std::endl;return 0;
}

2. 位运算的应用场景

  • 位掩码:使用位运算来设置和清除某些位,以实现状态标志的管理。
  • 位计数:使用位运算来统计一个整数中二进制位中1的个数,常用于优化算法。
  • 位解析:使用位运算来解析数据的各个字段,如网络协议中的数据帧解析。

示例代码

#include <iostream>// 判断整数n的第pos位是否为1
bool isBitSet(int n, int pos) {return (n & (1 << pos)) != 0;
}// 设置整数n的第pos位为1
int setBit(int n, int pos) {return n | (1 << pos);
}// 清除整数n的第pos位为0
int clearBit(int n, int pos) {return n & (~(1 << pos));
}// 更新整数n的第pos位为val(0或1)
int updateBit(int n, int pos, int val) {return (n & ~(1 << pos)) | (val << pos);
}int main() {int num = 5; // 二进制表示为 0000 0101// 判断第2位是否为1std::cout << "Bit at position 2 is set: " << isBitSet(num, 2) << std::endl;// 将第3位设置为1num = setBit(num, 3); // 0000 1101std::cout << "After setting bit at position 3: " << num << std::endl;// 将第0位清除为0num = clearBit(num, 0); // 0000 1100std::cout << "After clearing bit at position 0: " << num << std::endl;// 更新第1位为0num = updateBit(num, 1, 0); // 0000 1000std::cout << "After updating bit at position 1 to 0: " << num << std::endl;return 0;
}

3. 位运算的使用技巧

  • 使用位运算符代替乘除法:位移运算(左移和右移)可以代替乘除法进行数值的快速计算,提高效率。
  • 逻辑运算和位运算的结合:通过逻辑运算(与、或、非)和位运算(左移、右移)相结合,实现复杂逻辑的快速计算。

示例代码

#include <iostream>// 判断一个整数是否为2的幂
bool isPowerOfTwo(int n) {return n > 0 && (n & (n - 1)) == 0;
}// 计算2的幂次方
int powerOfTwo(int exp) {return 1 << exp; // 等价于 pow(2, exp)
}int main() {// 判断一个整数是否为2的幂std::cout << "Is 16 power of two? " << isPowerOfTwo(16) << std::endl; // 输出1// 计算2的幂次方std::cout << "2^5 = " << powerOfTwo(5) << std::endl; // 输出32return 0;
}

4. 实战案例分析

  • 位图:使用位运算来实现位图,节省内存空间,用于高效存储和处理大量布尔值信息。
  • 哈希函数:通过位运算来实现快速的哈希函数,用于在哈希表中快速查找和插入数据。

通过学习位运算,可以更好地理解计算机中整数的二进制表示方式,掌握位运算的基本原理和常用技巧,从而在实际编程中更加灵活地运用位运算来解决问题。

这篇关于【C++】位运算bitset的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108405

相关文章

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决