C程序之有、无符号位の二进制转十进制
为便于理解,不采用自定义函数形式而直接使用主函数main,有需要的自行改写。
无符号位二进制转换为十进制
方式一:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define MAXRANGE 256
int main()
{
char binaryScanf[MAXRANGE]; // 无符号字符二进制
int intBinaryScanf[MAXRANGE]; // 存储每个二进制元素
long int decimal = 0;
scanf("%s", binaryScanf); // 输入二进制数
for(int i = 0, j = strlen(binaryScanf); i < strlen(binaryScanf); i ++) // 字符二进制逆序转数型
intBinaryScanf[i] = binaryScanf[--j] - '0'; // 字符变数型
for(int i = 0; i < strlen(binaryScanf); i ++)
decimal += intBinaryScanf[i] * (int)pow(2,i); // 进制二转十公式
printf("%lu\n",decimal);
return 0;
}
方式二:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(void)
{
char str_bin[32];
gets(str_bin);
int sizeBin = strlen(str_bin);
int sum = 0;
for(int i = 0; i < sizeBin; i ++)
sum += (int)pow(2,(sizeBin-1-i)) * (str_bin[i] - '0');
printf("%d",sum);
return 0;
}
运行结果:
有符号位二进制转换为十进制
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define MAXRANGE 256
int main()
{
char binaryScanf[MAXRANGE]; // 有符号字符二进制
int decimal = 0; // 所求十进制
scanf("%s", binaryScanf); // 输入二进制数
if(binaryScanf[0] == '1') // 符号位 == 1
{
// 逆补码
for(int i = strlen(binaryScanf) - 1; i > 0; i --)
{
binaryScanf[i] -= 1;
if(binaryScanf[i] == '0')
break;
else
binaryScanf[i] = '1';
}
// 逆反码
for(int i = strlen(binaryScanf) - 1; i > 0; i --)
binaryScanf[i] == '0' ? (binaryScanf[i] = '1') : (binaryScanf[i] = '0');
// 二转十公式
for(int j = 0, i = strlen(binaryScanf) - 1; i > 0; i --)
decimal += (binaryScanf[i] - '0') * (int)pow(2,j++);
decimal = 0 - decimal; // 取负
}
else // 符号位 == 0
for(int j = 0, i = strlen(binaryScanf) - 1; i > 0; i --)
decimal += (binaryScanf[i] - '0') * (int)pow(2,j++);
printf("%d\n",decimal);
return 0;
}
运行结果:
符号位 == 0 の处理方法二
int intBinaryScanf[MAXRANGE]; // 存储每个二进制元素
for(int i = 1, j = strlen(binaryScanf) - 1; i < strlen(binaryScanf); i ++) // 字符二进制逆序转数型
intBinaryScanf[--j] = binaryScanf[i] - '0'; // 字符变数型
for(int i = 0; i < strlen(binaryScanf) - 1; i ++)
decimal += intBinaryScanf[i] * (int)pow(2,i); // 进制二转十公式
关于二进制转十进制说明
有符号位二转十:
- 判断符号位(最左端)为0或1
- 若为1:
- 二进制码 - 1(逆补码)
- 二进制码 反码,即1变0,0变1(逆反码)
- 二进制码公式:除了最左端的符号位,对经前两步处理过的二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。
- 给求和后的数加个负号“-”。
- 若为0:
直接套用二进制码公式:除了最左端的符号位,对当前二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。
无符号位二转十:
直接套用二进制码公式:对当前的二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。