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);     // 进制二转十公式

关于二进制转十进制说明

有符号位二转十:

  1. 判断符号位(最左端)为0或1
  2. 若为1:
  1. 二进制码 - 1(逆补码)
  2. 二进制码 反码,即1变0,0变1(逆反码)
  3. 二进制码公式:除了最左端的符号位,对经前两步处理过的二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。
  4. 给求和后的数加个负号“-”。
  1. 若为0:

直接套用二进制码公式:除了最左端的符号位,对当前二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。
有符号位二转十

无符号位二转十:
直接套用二进制码公式:对当前的二进制码,自右向左,每个位数依次 × 2 的 0,1,2,3……次方并求和。
无符号位二转十

发布了7 篇原创文章 · 获赞 3 · 访问量 678

猜你喜欢

转载自blog.csdn.net/qq_43634664/article/details/101725555