01十進位
十進位(逢10進1)是我們最常用的一種數位進位方式。十進位和二進位可以相互轉換,如下所示:
上圖中,10稱做基數,10^n(10的n次冪)被稱作權,… 10000、1000、100、10、1。
02二進位
二進位(逢2進1),是基數為"2"的進位。計算機使用二進位,是因為計算機設計者發現在複雜電路中,將低電平表示0,高電平表示1,只有兩種電位在通過門電路之後更容易計算。其實用其它進位也可以表示,但是比較麻煩。
二進位的基數為2,權為2^n(2的n次方),……、128、64、32、16、8、4、2 1。
03補碼基礎
關於補碼,有比較有趣的演化過程,假如計算機中使用4位的二進位表示數據,如圖3-1中的a,最多能表示0到15(10進位),後有計算機大佬在此基礎上做了一個細微改動,將所有二進位以1開頭的數(大於7的數)放到0之前:如圖3-1的b,並且規用用這部分8-15對應二進位表示負數-1到-8,這就是4位補碼:如圖3-1的c。
仔細觀察會發現,-1(1111)+1(0001) = 1 0000,捨棄最高位"1"(超出4位),保留最後4位(4個0),則-1(1111)+1(0001) = 0(1 0000)
同理-8(1000)+7(0111)=-1(1111)。
至此,得出了結論:在封閉的四位運算中(超出4位就丟棄),這種設計和規定是非常合理的。可是,我們又有了疑問:(-1)*(1)=?,會不會和結果就不一樣了?我來算一下:
結果一樣,(-1)*(-1)= 1即1111 * 1111 = 0001,這種數據運算規則就是補碼運算。
總結:
計算機中正數和負數的關係是取反加一。舉例如:~3+1=-3(~3表示對3取反)補碼運算是封閉的:運算結果保留在補碼範圍內,超範圍就溢出.補碼邊界運算有溢出風險.4位二進位補碼最多能表示2^4(16)個數,數的範圍是-8~78位二進位補碼最多能表示2^8(256)個數,數的範圍是-128~12716位二進位補碼最多能表示2^16(65536)個數,數的範圍是-32768~3276732位二進位補碼最多能表示2^32個數,數的範圍是-2G~2G-1(1G= 1024*1024*1024)當我們知道了計算機中的一個二進位數,比如0000 1111,它的10進位為:
0000 1111 = 2^3+2^2+2^1+2^0 = 15(十進位) // 因為是正數,直接轉換既可
那1111 1001,表示的十進位數是多少?
則計算機中存儲的1111 1001轉換為十進位數是-7。反過來的換算過程如下:
計算機中二進位(轉)十進位:
以0開頭的,直接將2進位轉換為10進位;以1開頭的,需要4步,按位取反->末尾位加1->轉換為十進位->添加負號。十進位數(轉)計算機中二進位數:
正數取原碼,負數按位取反末尾加1。需要注意的是:4位補碼不能表示8。
04Java中的二進位規則
Java內部只有二進位補碼,計算機內部數據以二進位補碼表示。Java內部採用補碼運算,自動發送上溢出(乘法為上溢出)和下溢出(除法為下溢出)。Java內部沒有10進位,但是Java儘量按照人類習慣輸入輸出。補碼的負數,最高位是1,也稱作符號位。
05十六進位
十六進位是二進位制的簡寫,方便專業人員書寫二進位數據。比如一個十進位數1234567890,用十六進位表示就比二進位表示更方便,如下所示:
十六進位的基數為16,權為16^n(16的n次方),...、4096、256、16、1。
十六進位與十進位對照表:
十六進位和其他進位間的轉換:
41(16進位) = 4*(16^1) + 1*(16^0) = 65(10進位) = 0100 0001(2進位)