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

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

1 bitset的定义和初始化

#include
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:"<

C++ bitset类验证总结 存储结构 输出顺序_第1张图片

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

2.2 按位输出

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

C++ bitset类验证总结 存储结构 输出顺序_第2张图片

 不难看出,当定义的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<C++ bitset类验证总结 存储结构 输出顺序_第3张图片

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

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

C++ bitset类验证总结 存储结构 输出顺序_第4张图片

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

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

你可能感兴趣的:(C++,c++,算法)