一、題目描述
為方便調試位運算相關程序,先做個展現位模式的小工具。
建議參照以下接口實現:
// 利用函數重載特性:
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;}}}