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存储方式的理解,主要包含了存储方式以及输出方式,还有就是按位寻找(计算行列值)注意的地方~
第一次写文章,欢迎多多指教啊^ - ^