bitset用法:16进制输出成2进制、获取16位2进制某个区间的值、改变16位2进制某个区间的值

80 篇文章 0 订阅
67 篇文章 1 订阅

简介

std::bitset 是C++标准库中的一个类模板,用于表示固定大小的位序列。
template <size_t N> class bitset;
bitset,从名字就可以看出来,是一个(比特)二进制(0和1)的集合
std::bitset 模板类定义在 头文件中,并接受一个模板参数 N,表示位集的大小。
例如:
bitset在内存中是以4或8个字节为单位存储的

sizeof(bitset<1>) 1位的时候占4个字节

sizeof(bitset<32>) 32位的时候占4个字节

sizeof(bitset<33>) 33位的时候占8个字节

sizeof(bitset<65>) 65位的时候占个16字节 (2倍增长动态分配内存空间的机制在计算机中很常见,c++的vector内存也是这样)
它提供了一种方便且高效的方式来处理位操作。

std::bitset 提供了许多成员函数和操作符,用于处理位序列。以下是一些常用的成员函数和操作符:

构造函数

bitset():创建一个所有位都设置为0的位集。
bitset(unsigned long long val):创建一个位集,并将其初始化为给定的无符号长长整数值。
bitset(const std::string& str):创建一个位集,并将其初始化为给定的二进制字符串(只包含 ‘0’ 和 ‘1’)。
示例:

  1. 构造
bitset<10> a;			//a:0000000000
  1. 用一个数值初始化

(1)当用一个数值去构造的时候,其实就是将数值在内存中的存储方式显示出来。(数值在内存中是以补码形式存储的)
(2)若bitset的位数n小于数值的位数,只取数值(小端的)前n位初始化给bitset

bitset<4> a(-16);		//-16的补码为11111111.....10000,a有4位,因此a:0000

bitset<5> a(17);		 //17的补码为00000000.....10001,a有5位,因此a:10001

bitset<6> a(-8);		//-8的补码为 11111111.....11000,a有6位,因此a:111000

bitset<7> a(8);			 //8的补码为 00000000.....01000,a有7位,因此a:0001000
  1. 用字符串string 或者 char[]初始化
//以string为例,char[]与其用法相同 

string b = "100101111";	//这里特别注意,bitset的size和字符串长度不匹配的时候如何构造

bitset<3> a(b);			//a:100			  //当bitset的size小于等于字符串长度,取字符串的前size位

bitset<6> a(b);			//a:100101

bitset<9> a(b);			//a:100101111

bitset<12> a(b);		//a:000100101111  //当bitset的size大于字符串长度,进行补零

成员函数

size():返回位集的大小(位数)。
count():返回位集中设置为1的位的数量。
any():检查位集中是否有任何位设置为1。
none():检查位集中是否所有位都设置为0。
set():将位集中的特定位设置为1。
reset():将位集中的特定位设置为0。
flip():翻转位集中的特定位(0变为1,1变为0)。
to_ulong():将位集转换为无符号长整型。
to_ullong():将位集转换为无符号长长整型。
to_string():将位集转换为二进制字符串表示。

示例:

  1. count() 返回bitset中 1 的个数
// 成员函数声明
size_t count() const;
// 用例
bitset<6> a("011101");
cout << a.count() // 4
  1. size() 返回size大小
// 成员函数声明
size_t size() const;
// 用例:
bitset<6> a("011101");
cout << a.size(); // 6
  1. test() 返回某一位(下标)是否为1
// 成员函数声明
bool test (size_t pos) const;
// 用例:
bitset<6> a("011101");
cout << a.test(0) << endl;	//1	(true)
cout << a.test(1) << endl;	//0	(false)
cout << a.test(5) << endl;	//0 (false)
  1. any() 只要有一位是1,就返回true,否则返回false
//成员函数声明
bool any() const;
//用例:
cout << bitset<4>("0001").any() << endl;	//1	(true)
cout << bitset<4>("0000").any() << endl;	//0	(false)
  1. none() 若全为0,返回true,否则返回false
// 成员函数声明
bool none() const;
// 用例:
cout << bitset<4>("0000").none() << endl;	//1	(true)
cout << bitset<4>("0001").none() << endl;	//0	(false)
  1. all() 若全为1,返回true,否则返回false
// 成员函数声明
bool all() const noexcept;
// 用例:
cout << bitset<4>("1111").all() << endl;	//1	(true)
cout << bitset<4>("1101").all() << endl;	//0	(false)
  1. set() 全部置1,或者某一位置1或0
// 成员函数声明
bitset& set() noexcept;
//用例:
// 1.全部置1
bitset<6> a("011101");
a.set();
cout << a << endl;	//输出:111111

// 2.set也可以指定参数,第一个参数是索引,第二个true表示置1,false表示置0
bitset& set (size_t pos, bool val = true);
//
bitset<6> a("011101");
a.set(0,0);
a.set(5,1);
cout << a << endl;	//输出:111100
  1. reset()· 全部置0,或者某一位置0
//成员函数声明
bitset& reset();
bitset& reset (size_t pos);
// 用例:
bitset<6> a("011100");
a.reset();
cout << a << endl;	//输出:000000
// 可以指定参数,单独将某一位置0
bitset<6> a("011100");
a.reset(0);
cout << a << endl;	//输出:011101
  1. flip() 全部取反,或者某一位取反
// 成员函数声明
bitset& flip();	
bitset& flip (size_t pos);
// 用例:
bitset<6> a("011100");
a.flip();
cout << a << endl;	//输出:100011
// 可以指定参数,单独将某一位取反
bitset<6> a("011100");
a.flip(0);
a.flip(1);
cout << a << endl;	//输出:011111
  1. to_string() 转换为字符串
bitset<6> a("011100");
auto x = a.to_string();
cout << x ;		//	011100
  1. to_ulong() 转换为无符号long类型
bitset<6> a("011101");
auto x = a.to_ulong();
cout << x ; // 输出:29 	1 + 4 + 8 + 16 = 29
  1. to_ullong() 转换为无符号long long类型
bitset<6> a("011101");
auto x = a.to_ullong();	//同上
cout << x ;   //29

操作符

位操作符(如 &、|、^、~):执行按位与、或、异或和取反操作。
比较操作符(如 ==、!=、<、<=、>、>=):比较两个位集的值。
示例:
运算符重载[],支持下标从0开始访问,与数组类似
注意 :下标小的是小端

bitset<4> a;	//a:0000(默认构造函数)
a[0] = 1;
a[2] = 1;
//a:0101

bitset<7> b("1001101");
for (int i = 0; i < 7; i++)
    cout << b[i] << ' ';//输出:1011001

基本示例

下面是一个简单的示例,介绍如何使用 std::bitset

#include <iostream>  
#include <bitset>  
  
int main() {  
    // 创建一个包含8位的位集,并初始化为二进制字符串 "10101010"  
    std::bitset<8> bits("10101010");  
      
    // 输出位集的大小和设置为1的位的数量  
    std::cout << "Size: " << bits.size() << std::endl;  
    std::cout << "Count: " << bits.count() << std::endl;  
      
    // 翻转第3位和第5位  
    bits.flip(2); // 索引从0开始,所以第3位是索引2  
    bits.flip(4); // 索引从0开始,所以第5位是索引4  
      
    // 输出修改后的位集  
    std::cout << "Modified bitset: " << bits << std::endl;  
      
    return 0;  
}

输出结果

Size: 8  
Count: 4  
Modified bitset: 10100010

bieset进阶示例

使用一定包含头文件

#include <bitset>
#include <iostream>
将16进制转换成2进制

示例:

    {
        unsigned int hexNum = 0xa;
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "原始值: " << hexNum;

        // 将int类型的16进制数转换为unsigned long类型
        unsigned long ulHexNum = hexNum;

        // 使用unsigned long类型的数创建一个std::bitset<16>
        std::bitset<16> bitsetHexNum(ulHexNum);

        // 输出bitset
        std::cout << u8"int to Bitset: " << bitsetHexNum << std::endl;
    }

输出结果

[ ..\untitled36\mainwindow.cpp 16 ] 原始值:  10
int to Bitset: 0000000000001010

获取16位(自定义位数)2进制某个区间的值

示例:

{
        // 创建一个16位的二进制数
        std::bitset<16> binaryNum("1101001010101010");

        // 创建一个掩码,其中的第3-7位为1,其余为0
        std::bitset<16> mask;
        // 注意,bitset的下标是从0开始的,所以第3位对应下标2
        for(int i = 2; i < 7; ++i) {
            mask.set(i, true);
        }
        std::cout << "3-7bit mask: " << mask << std::endl;

        // 应用掩码,得到结果
        std::bitset<16> result = binaryNum & mask;

        // 输出结果
        std::cout << "get 3-7 bit Result: " << result << std::endl;
}

输出结果

3-7bit mask: 0000000001111100
get 3-7 bit Result: 0000000000101000

改变32位(自定义位数)2进制某个区间的值

示例:

{
        // 原始32位二进制数(默认全是0)
        unsigned int binaryNum = 0xffffffff;

        // 要设置的ushort数值
        unsigned short num = 0x15;

        // 将num左移以匹配目标位置(第5-10位)
        unsigned int shiftedNum = num << 5;

        // 创建一个掩码,覆盖目标位(第5-10位为1,其余为0)
        unsigned int mask = (1 << 10) - (1 << 5);
        std::cout << "5-10 mask: " << std::bitset<32>(mask) << std::endl;
        binaryNum &= ~mask;
        std::cout << "5-10 binaryNum: " << std::bitset<32>(binaryNum) << std::endl;

        // 将掩码与原始二进制数进行按位或运算以设置新的值
        binaryNum |= (shiftedNum & mask);

        std::cout << "change 5-10 Result: " << std::bitset<32>(binaryNum) << std::endl;
}        

输出结果

5-10 mask: 00000000000000000000001111100000
5-10 binaryNum: 11111111111111111111110000011111
change 5-10 Result: 11111111111111111111111010111111

至此。

  • 22
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值