一、题目描述
为方便调试位运算相关程序,先做个展现位模式的小工具。
建议参照以下接口实现:
// 利用函数重载特性:
string dump_bits(char x);
string dump_bits(short x);
string dump_bits(int x);
string dump_bits(long long x);
// 或用函数模板实现:
template<typename T>
string dump_bits(T x);
先导题:字节解析(需要读入十六进制数据)、字节序。
输入规格
- 由若干组测试数据构成,格式自由,处理至EOF为止。
- 每组开头是
i8 i16 i32 i64
四种类型之一,之后分别有1/2/4/8个字节的数据。 - 数据以小端序导出(参考字节序题目)。
- 数据间有长度不定的空白符,每组数据可能跨越多行。目的是演示输入流的性质,无需特殊处理。
输出规格
- 每组数据以大端序输出其各字节的位模式,每字节8位,字节间以下划线分隔。
样例输入
i8 88
i16 ab cd
i32 01 23
45 67 i64
01 23 45 67 89 ab CD Fe
样例输出
10001000
11001101_10101011
01100111_01000101_00100011_00000001
11111110_11001101_10101011_10001001_01100111_01000101_00100011_00000001
样例解释
- 第1组:共1个字节
88
,对应0x88
- 第2组:共2个字节
ab cd
,对应0xCDAB
- 第3组:共4个字节
01 23 45 67
,对应0x67452301
- 第1组:共8个字节
01 23 45 67 89 ab CD Fe
,对应0xFECDAB8967452301ULL
二、完整C++代码实现
#include<iostream>
#include<cstdint>
using namespace std;
string parse_byte(char hi){
string ss="";
if(hi>='0'&&hi<='9'){
hi=hi-'0';
}else if(hi>='a'&&hi<='f'){
hi=hi-'a'+10;
}else if(hi>='A'&&hi<='f'){
hi=hi-'A'+10;
}
for(int i=3;i>=0;i--){
ss+=(hi>>i)&1?'1':'0';
}
return ss; // TODO
}
string dump_bits(string x){
string s8;
s8+= parse_byte(x[0])+parse_byte(x[1]);
return s8;
}
int main(){
string type;
while(cin>>type){
if(type=="i8"){
string x;
cin>>x;
string result=dump_bits(x);
cout<<result<<endl;
}else if(type=="i16"){
string x;
string result;
string s[2];
for(int i=0;i<2;i++){
cin>>x;
s[i]=dump_bits(x);
}
result+=s[1]+"_"+s[0];
cout<<result<<endl;
}else if(type=="i32"){
string x;
string result;
string s[4];
for(int i=0;i<4;i++){
cin>>x;
s[i]=dump_bits(x);
}
for(int i=3;i>=0;i--){
if(i==0){
result+=s[i];
}
else{
result+=s[i]+"_";
}
}
cout<<result<<endl;
}else if(type=="i64"){
string x;
string result;
string s[8];
for(int i=0;i<8;i++){
cin>>x;
s[i]=dump_bits(x);
}
for(int i=7;i>=0;i--){
if(i==0){
result+=s[i];
}else{
result+=s[i]+"_";
}
}
cout<<result<<endl;
}
}
}