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……次方並求和。