这里提供两种方法,第一种是直接把二进制数转换为十进制、八进制和十六进制;第二种是先把二进制数转换为十进制数,再把十进制数转换为八进制和十六进制。
方法一:
#include<stdio.h>
void input(char binary[]) {//输入二进制数
puts("Input a binary number:");
char e; int i = -1;
scanf("%c", &e);
while (e == '0' || e == '1') {
binary[++i] = e;
scanf("%c", &e);
}
}
void swap(char &c1, char &c2) {//交换两个char型变量
char temp;
temp = c1;
c1 = c2;
c2 = temp;
}
void invert(char binary[]) {//由于二进制数是按顺序输入的,因此将其转置从而使二进制权重按下标递增,方便后续计算
int num = 0, i = 0,j;
while (binary[i++])num++;
i = 0; j=num - 1;
while (i < j)
swap(binary[i++], binary[j--]);
}
void bi_to_dec(char binary[], int& dec) {//将二进制数转换为十进制数
int i = 0;
int t = 1;
while (binary[i]) {
dec += (binary[i] - '0') * t;//位乘权再求和
t *= 2;//每位的权
i++;
}
}
void bi_to_oct(char binary[], int& oct) {//将二进制数转换为八进制数
int i = 0, t = 1;
int item;
while (binary[i + 2]) {
item = (binary[i] - '0') * 1 + (binary[i + 1] - '0') * 2 + (binary[i + 2] - '0') * 4;//三位二进制位并做一位八进制位
oct += item * t;
t *= 10;//将结果化为十进制整数,这样方便存储和输出
i += 3;
}
//处理二进制位数不是3的倍数的情况
if (binary[i] && binary[i + 1])
oct = ((binary[i] - '0') * 1 + (binary[i+1] - '0') * 2) * t + oct;
else
if (binary[i])
oct = (binary[i] - '0') * 1 * t + oct;
}
void bi_to_hex(char binary[], int hex[]) {//将二进制数组转换为十六进制数组
//十六进制似乎难以用某个数存储,因此这里使用一个int型数组存储每个16进制位
int i = 0, j = 0, t = 1;
while (binary[i + 3]) {
hex[j++] = (binary[i] - '0') * 1 + (binary[i + 1] - '0') * 2 + (binary[i + 2] - '0') * 4 + (binary[i + 3] - '0') * 8;
//四位二进制位并做一位十六进制位
i += 4;
}
//处理二进制位数不是4的倍数的情况
if (binary[i] && binary[i + 1] && binary[i + 2])
hex[j++] = (binary[i] - '0') * 1 + (binary[i + 1] - '0') * 2 + (binary[i + 2] - '0') * 4;
else
if (binary[i] && binary[i + 1])
hex[j++] = (binary[i] - '0') * 1 + (binary[i + 1] - '0') * 2;
else
if (binary[i])
hex[j++] = (binary[i] - '0') * 1;
}
int main() {
char binary[32] = { 0 };
input(binary);
invert(binary);
int dec = 0;
bi_to_dec(binary, dec);
printf("The number is %d in decimal.\n", dec);
int oct=0;
bi_to_oct(binary, oct);
printf("The number is %d in octal.\n", oct);
int hex[8] = { 0 };
bi_to_hex(binary, hex);
int i = 8;
while (hex[--i]==0);
printf("The number is ");
while (i >= 0) {
if (hex[i] >=10)
printf("%c", hex[i] + 55);
else
printf("%d", hex[i]);
i--;
}
printf(" in hexadecimal.\n");
return 0;
}
方法二:
#include<stdio.h>
int main() {
char binary[32];
puts("Input a binary number:");
char e;int i = -1;
scanf("%c", &e);
while (e =='0' || e == '1') {
binary[++i] = e;
scanf("%c", &e);
}//输入二进制数
int dec=0;
int t = 1;
while (i >= 0) {
dec += (binary[i]-'0') * t;
t *= 2;
i--;
}//2转10
printf("The number is %d in decimal.\n", dec);
int oct = 0;
int temp = dec;
t = 1;
while (temp) {
oct += temp % 8 * t;
temp/= 8;
t *= 10;
}//10转8
printf("The number is %d in octal.\n", oct);
temp = dec;
int hex[8];
i = -1;
while (temp) {
hex[++i] = temp % 16;
temp /= 16;
}
printf("The number is ");
while (i >= 0) {
if (hex[i] >= 10)
printf("%c", hex[i] + 55);
else
printf("%d", hex[i]);
i--;
}//输出16进制数
printf(" in hexadecimal.\n");
return 0;
}