C++ bitset类验证总结 存储结构 输出顺序

bitset类使得处理二进制位序(可以按位访问二进制序列)更加容易。

1 bitset的定义和初始化

#include<bitset>
using namespace std;
typedef bitset<8> byte;
typedef bitset<32> word;

//之后就可以使用byte和word来定义8和32位二进制序列了
extern byte S[256];
extern byte inv_S[256];
extern word rcon[10];
extern byte encry_s[4*4];

2 验证bitset类型的数据在计算机中存储的形式

2.1 直接输出

// 0x57二进制序列为:0101 0111
// 0x83二进制序列为:1000 0011

byte temp0=0x57;
byte temp1=0x83;
cout<<"temp0:"<<temp0<<endl;
cout<<"temp1:"<<temp1<<endl;

可以看出直接输出按照的是大端模式(“高低低高”:高位放低阶,低位放高阶);

2.2 按位输出

	byte temp0=0x57;
	byte temp1=0x83;
	cout<<"temp0:";
	for(int i=0;i<8;i++){
		cout<<temp0[i]<<" ";
	}
	cout<<endl;
	cout<<"temp1:";
	for(int i=0;i<8;i++){
		cout<<temp1[i]<<" ";
	} 

 不难看出,当定义的byte类型的数字按位输出时,输出和我们想的不太一样,顺序反了有木有~

没错,这就是你使用bitset类型时候需要注意的地方!!!这里是小端模式(“高高低低”:高位放高阶,低位放低阶);

比如在AES字节代换计算行号和列号你可能就需要“反着”来了:

//先确定密钥字所在的位置
int row=sw[i+7]*8+sw[i+6]*4+sw[i+5]*2+sw[i+4]*1;
int col=sw[i+3]*8+sw[i+2]*4+sw[i+1]*2+sw[i]*1;

3 有关bitset类型的运算

比如temp0^temp1,我们来看一下不同的输出方式效果一样不一样:

    byte temp0=0x57;
	byte temp1=0x83;
	cout<<"temp0:";

    // 按位输出
	for(int i=0;i<8;i++){
		cout<<temp0[i]<<" ";
	}
	cout<<endl;
	cout<<"temp1:";
	for(int i=0;i<8;i++){
		cout<<temp1[i]<<" ";
	} 
	cout<<endl; 
	cout<<endl;
    
    // 直接输出
	cout<<"temp0^temp1= "<<(temp0^temp1);

 直接输出的话依旧是常规的大端模式:

    byte temp0=0x57;
	byte temp1=0x83;
	cout<<"temp0:";
	for(int i=0;i<8;i++){
		cout<<temp0[i]<<" ";
	}
	cout<<endl;
	cout<<"temp1:";
	for(int i=0;i<8;i++){
		cout<<temp1[i]<<" ";
	} 
	cout<<endl; 
	cout<<endl;
    
    // 按位输出异或结果
	byte temp2=temp0^temp1;
	cout<<"temp2:";
	for(int i=0;i<8;i++){
		cout<<temp2[i]<<" ";
	} 

 按位输出确定就是我们逻辑的小端模式:

 以上就是我对bitset存储方式的理解,主要包含了存储方式以及输出方式,还有就是按位寻找(计算行列值)注意的地方~

第一次写文章,欢迎多多指教啊^ - ^

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲不好代码的小透明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值