先贴出自己写的代码:
#include<iostream>
#include<string>
#include<map>
using namespace std;
string dbit;
map<string,string> map_bit_hex;
void deal_map()//2进制转八进制,STL中map的运用,以这种写法主要为了熟悉其掌握。
{
map_bit_hex["000"] = "0";
map_bit_hex["001"] = "1";
map_bit_hex["010"] = "2";
map_bit_hex["011"] = "3";
map_bit_hex["100"] = "4";
map_bit_hex["101"] = "5";
map_bit_hex["110"] = "6";
map_bit_hex["111"] = "7";
}
void my_strcpy(int j, string &strs, const char *bits) {
if (j == 0) {
int i = 0, k = 0;
while (bits[i] == '0') {
i++;
}
strs.append(bits+i);
}
else {
strs.append(bits);
}
}
void hex_bit(string &hex)
{
int j;
dbit = "";
for (j = 0; j < hex.length(); j++) {
switch (hex[j]) {
case '0':
my_strcpy(j, dbit, "0000");
break;
case '1':
my_strcpy(j, dbit, "0001");
break;
case '2':
my_strcpy(j, dbit, "0010");
break;
case '3':
my_strcpy(j, dbit, "0011");
break;
case '4':
my_strcpy(j, dbit, "0100");
break;
case '5':
my_strcpy(j, dbit, "0101");
break;
case '6':
my_strcpy(j, dbit, "0110");
break;
case '7':
my_strcpy(j, dbit, "0111");
break;
case '8':
my_strcpy(j, dbit, "1000");
break;
case '9':
my_strcpy(j, dbit, "1001");
break;
case 'A':
my_strcpy(j, dbit, "1010");
break;
case 'B':
my_strcpy(j, dbit, "1011");
break;
case 'C':
my_strcpy(j, dbit, "1100");
break;
case 'D':
my_strcpy(j, dbit, "1101");
break;
case 'E':
my_strcpy(j, dbit, "1110");
break;
case 'F':
my_strcpy(j, dbit, "1111");
break;
}
}
}
void bit_oct_print()
{
int apply;
apply = dbit.length()%3;
if(apply == 0)//补位。这是一个重点,使其为三的倍数
{
}
else if(apply == 1)
{
dbit.insert(0,"00");//可以写成 dbit = "00" + dbit
}
else if(apply == 2)
{
dbit.insert(0,"0");
}
else{cout << "error 1";}
int p = 0;
while(p*3 != dbit.size())
{
string temp;
temp = string(dbit,p*3,3);
cout << map_bit_hex[temp];
p++;
}
putchar(10);
}
int main()
{
int linenum;
int i;
deal_map();
string hex_data[10];
cin >> linenum;
for(i = 0;i < linenum;i++)
{
cin >> hex_data[i];
}
for(i = 0;i < linenum;i++)
{
hex_bit(hex_data[i]);
bit_oct_print();
}
system("pause");
return 0;
}
自己的代码有点冗长,主要因为在处理八进制转二进制没有用更好的办法。
以下是别人的代码。
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
cin>>n;
for(int k=1;k<=n;k++)
{
string s1,s2;//s1为输入的原始的十六进制串,s2为转化成的二进制串
cin>>s1;
s2="";//初始化
for(int i=0;i<s1.length();i++)//遍历,字符串上加上每一位
{
switch(s1[i])
{
case '0':s2+="0000";break;
case '1':s2+="0001";break;
case '2':s2+="0010";break;
case '3':s2+="0011";break;
case '4':s2+="0100";break;
case '5':s2+="0101";break;
case '6':s2+="0110";break;
case '7':s2+="0111";break;
case '8':s2+="1000";break;
case '9':s2+="1001";break;
case 'A':s2+="1010";break;
case 'B':s2+="1011";break;
case 'C':s2+="1100";break;
case 'D':s2+="1101";break;
case 'E':s2+="1110";break;
case 'F':s2+="1111";break;
default:break;
}
}
int len=s2.length();
if(len%3==1)//三个二进制为一位八进制,二进制串前面补0,确保二进制串的长度为3的倍数
s2="00"+s2;
else if(len%3==2)
s2="0"+s2;
int flag=0;
for(int i=0;i<=s2.length()-3;i+=3)
{
int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+(s2[i+2]-'0');
if(num)
flag=1;//忽略前导0
if(flag)
cout<<num;
}
cout<<endl;
}
return 0;
}
map参考来源:https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html