我們在日常使用的數(shù)據(jù)基本都是十進制的,但對于計算機而言,二進制數(shù)據(jù)更符合計算機的運算規(guī)則,不過二進制的數(shù)據(jù)用較長的位來表示一個實際并不大的數(shù)很是麻煩,所以又有了八進制和十六進制,在計算機底層中這些都是比較常用到的進制。所以這就引發(fā)了一個問題,不同的進制之間,如何進行進制轉(zhuǎn)換?在python中進制轉(zhuǎn)換是python內(nèi)置的功能,接下來我們就來看看python實現(xiàn)進制轉(zhuǎn)換是怎么操作的吧。
一、導言
導語:
在計算機進行數(shù)據(jù)交換時,常常會有一個進制轉(zhuǎn)換的過程,我們知道計算機只認0 和 1.在內(nèi)存系統(tǒng)中,基本基于二進制進行運算的,但是有時候數(shù)據(jù)過于龐大,為了方便存儲管理,計算機會使用十六進制存儲數(shù)據(jù),但是怎么實現(xiàn)數(shù)據(jù)轉(zhuǎn)換呢?
我們?nèi)祟愑墒种割^,所以自然就使用十進制啦,每當我們數(shù)數(shù)字到10之后,于是就重0 開始繼續(xù)數(shù),所以逢十進一就這么來了。
對于其它進制呢,也是同樣的,比如最常見的二進制,也就是逢二進一,慢慢來,依次類推,所以數(shù)學的世界是多么的奇妙呀!
今天給大家?guī)淼氖鞘褂?Python 實現(xiàn)進制轉(zhuǎn)換,內(nèi)容包括如下:
dec(十進制)—> bin(二進制)
dec(十進制)—> oct(八進制)
dec(十進制)—> hex(十六進制)
二、各種進制介紹
在轉(zhuǎn)換之前,我們先了解以下各種進制
十進制(Decimal)
我們所熟知的十進制,其實是從 0 開始,數(shù)到 9 之后,就跳到 10,這樣就變成了 10,數(shù)數(shù)大家總會把
二進制(Binary)
二進制同理,從 0 開始也就是 00(前面的一個0可以省去,但是為了更好的描述,所以保留),到 01,也變成了 10【對應十進制中的 3】,然后是 11【對應十進制中的 4】,100【十進制中的5】。。。以此類推
因為 二進制 的英文單詞是 binary,所以在計算機運算的過程中,使用二進制會用如下方法,0b11(4),0b1101(13)等等
八進制(Octal)
理解了二進制,在理解八進制就很容易了,八進制是逢八進一,范圍是 0~7,對比一下二進制,就很好理解啦??!
十六進制(Hexadecimal)
十六進制就可能會相對復雜一點點,十六進制是用數(shù)字 0~9 和 英文字母 A - F(大小寫隨意) 表示,因此 A代表 10, F代表 15。為什么在計算機領域中,十六進制用途會如此廣泛呢?
給大家看一個對比:
當數(shù)據(jù)比較大的時候,二進制顯然不再那么使用,再看使用十六進制,就簡短很多。
十六進制的運用領域可不止如此,比如原畫師調(diào)色的時候,如果使用 RGB 三原色的話,那就會有 256 x 256 x 256 種組合,我們就可以使用十六進制,把每一種顏色對比轉(zhuǎn)換成 十六進制字符,就會方便很多,以下是我之前調(diào)色的時候?qū)懙囊粋€很簡單一個 C 語言小程序,呃,似乎有點跑題了,哈哈,不管了
#include<stdio.h> #include<stdlib.h> int main() { printf("rgb三原色轉(zhuǎn)16進制 "); int a,b,c,d; while(d != 2){ printf("輸入1繼續(xù),輸入2退出 "); scanf("%d",&d); scanf("%d%d%d",&a,&b,&c); printf("[%x %x %x] ",a,b,c); //%x 可以直接把我們輸入的十進制轉(zhuǎn)換為 十六進制 } return 0; }
三、使用 Python 代碼完成轉(zhuǎn)換
3.1 十進制轉(zhuǎn)換為二進制
我記得不太清楚是啥時候第一次學進制轉(zhuǎn)換的,進制轉(zhuǎn)換常用的方法就是對 2 取余數(shù),然后得到余數(shù)反轉(zhuǎn)連在一起就是 我們所需要的二進制,舉個例子,比如我要計算 十進制數(shù) 13 的 二進制是多少?
這也是老師教我們的方法,也是我們第一次接觸進制轉(zhuǎn)換的時候,用目標數(shù) num 對 2求 余數(shù),直到 商為 0 的時候,結(jié)束,然后將余數(shù)反向組合輸出,及為我們所求的 2 進制數(shù)。有的同學會問,我怎么就能這么確定這就是 13 對應的 2 進制數(shù)呢?
答曰:
由于二進制的特殊性,數(shù)字從右邊往左邊數(shù),依次對應 20 x 1 + 21 x 0 + 22x 1 + 23 x 1 = 1 +4 +8 = 13, 給大家一個速記口訣,1,2,4,8,16,32,64,128,256,512,1024。分別是 20~ 210對應的值
所以有了思路,我們就可以愉快的敲代碼了
# 十進制整數(shù)轉(zhuǎn)二進制 def dec_to_bin(num): #函數(shù)名做到見其名知其意 l = [] # 創(chuàng)建一個空列表 if num<0: # 是負數(shù)轉(zhuǎn)換成整數(shù) return "-"+ dec_to_bin(abs()) # 如過是負數(shù),先轉(zhuǎn)換成正數(shù) while True:
num, reminder = divmod(num,2) # 短除法,對2求,分別得到除數(shù) 和 余數(shù)、這是 Python 的特有的一個內(nèi)置方法,分別可以到商 及 余數(shù)
l.append(str(reminder)) # 把獲得的余數(shù) 存入字符串
if num == 0: # 對應了前面的話,當商為 0時,就結(jié)束啦
return “”.join(l[::-1]) # 對列表中的字符串進行逆序拼接,得到一個二進制字符串
3.2 十進制轉(zhuǎn)八進制
理解了二進制的轉(zhuǎn)換,八進制一樣不難。同樣是目標數(shù) num對八 求商,留余數(shù),照這個思路走。檢驗的時候,一樣,把 2n把2 替換成 8即可。
看代碼:
和 二進制 的基本沒啥卻別
# 十進制轉(zhuǎn)八進制 def dec_to_oct(num): l = [] if num<0: return "-"+ dec_to_bin(abs(num)) # 如過是負數(shù),先轉(zhuǎn)換成正數(shù) while True: num, reminder = divmod(num,8) # 短除法,對2求,分別得到除數(shù) 和 余數(shù)、 l.append(str(reminder)) # 把獲得的余數(shù) 存入字符串 if num == 0: return "".join(l[::-1]) # 對列表中的字符串進行逆序拼接,得到一個二進制字符串
3.3 十進制轉(zhuǎn)十六進制
前面說過,十六進制相比二進制,八進制會復雜一點,但是方法是一樣的
# 十進制轉(zhuǎn)十六進制(這個相對麻煩一點,因為,十六進制包含 A-F,大小寫不敏感) def dec_to_hex(num): base = [str(x) for x in range(10)] +[chr(x) for x in range(ord('A'),ord("A")+6)] # 前者把 0 ~ 9 轉(zhuǎn)換成字符串存進列表 base 里,后者把 A ~ F 存進列表 l = [] if num<0: return "-"+dec_to_hex(abs(num)) while True: num,rem = divmod(num,16) # 求商 和 留余數(shù) l.append(base[rem]) if num == 0: return "".join(l[::-1])
最后看一下運行結(jié)果,是不是很方便呢?當然 Python 有內(nèi)置的方法,比如我們直接輸入 十進制數(shù),通過 bin(n) 轉(zhuǎn)為二進制,oct(n) 轉(zhuǎn)為 八進制,hex(n) 轉(zhuǎn)為十六進制。但是原理了解以下還是很有必要的,你說是不是呢?
到此這篇python實現(xiàn)進制轉(zhuǎn)換的文章到這里就結(jié)束了,希望能對小伙伴有一定的幫助,也希望大家以后多多支持W3Cschool!