1. 程式人生 > >「學習筆記」進位制轉換

「學習筆記」進位制轉換

前言

由於本人正在準備自考,所以學習下c語言以及相關的基礎,最近會更新很基礎的知識

進位制

常用的進位制分別為2進位制、10進位制(生活常用)、16進位制

進位制間的關係表

二進位制 十進位制 十六進位制
0 0 0
1 1 1
10 2 2
11 3 3
100 4 4
101 5 5
110 6 6
111 7 7
1000 8 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
10000 16 10
10001 17 11
... ... ...
11111111 255 FF

進位制間的轉換

二進位制轉十進位制

1.簡單方法適用於所有位上均為1的情況

​ 公式: result = 2^n -1

​ 說明:result為十進位制結果,n為1的個數

​ 讀作:2的n次方減1

​ 例:1111有4個1,那麼就有 2^4 - 1 = 16 -1 = 15

2.無符號按位加權:適用於無符號情況(c語言中int型預設有符號)

​ 二進位制8位數,從右往左從0~7寫位權​

​ 公式:result = n1x2^7 + n2x2^6 + n3x2^5 + n4x2^4 + n5x2^3 + n6x2^2 + n7x2^1 + n8x2^0

​ 說明:result為結果,n1~n8分別為二進位制數第1到第8位數,2的位權次方

​ 讀作: 每個二進位制數位與2的位權次方之和

​ 舉例:111的前五位均為0,那麼乘後也為0,2的0次方為1省略不計算,

1x2^2 + 1x2^1 + 1x2^0 = 4+2+1 = 7

3.有符號按位加權:負數,符號位為1;非負數符號位為0

其中符號位為0(正數)的情況下與上述方法完全相同。

符號位為1的時候(負數),在計算第1位前乘-1

​ 公式:result = -n1x2^7 + n2x2^6 + n3x2^5 + n4x2^4 + n5x2^3 + n6x2^2 + n7x2^1 + n8x2^0

​ 舉例:有符號10000000轉十進位制,首先是有符號並且符號位為1,說明是負數,則有

-1x2^7 + 0x2^6 + 0x2^5 + 0x2^4 + 0x2^3 + 0x2^2 + 0x2^1 + 0x2^0 = -128

十進位制轉二進位制

取餘法

  1. 將十進位制數進行多次除二,直到商為0,記錄每次是否被整除,整除記0,不整除記1
  2. 將記下的數由下至上即可得到二進位制數

舉例:十進位制18,第一次整除記0,第二次不整除記1,第三次四次記0,最後一次記1,倒序就是10010

二進位制轉16進位制

查表法

一旦遇到很多二進位制數,你就從右往左,每四個為一組

一旦遇到十六進位制數,把每個十六進位制數拆解成 4 位二進位制數

Linux上轉換進位制

  1. 使用bc命令,需要安裝bc
    • 命令:echo "obase=x;ibase=y;z" | bc
    • 說明:其中obase中的x為要轉換成的進位制用數字表示, ibase的y為當前輸入進位制數字,z為待轉換數
  2. 使用((num=x#y))&& echo $num 轉換十進位制
    • 說明 x為進位制數,y為輸入數

本文整理自小甲魚的論壇,原貼見連結