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……次方並求和。
無符號位二轉十

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章