一、题目描述
为方便调试位运算相关程序,先做个展现位模式的小工具。
建议参照以下接口实现:
// 利用函数重载特性:
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 88i16 ab cdi32 01 2345 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;}}}