引子
某天研究 fail-fast機制的時候,去看了看hashcode的實現方式,然後發現每個物件的實現都不一樣;於是研究乙個string的;於是看到公式:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
於是很不解,這個公式很明顯會溢位(超過2^32),嘗試了幾次發現系統會輸出hashcode為負數的值,就默默地去回顧一下二進位制的加減乘除
準備工作:
-2 = 0xfffffffe
-1 = 0xffffffff
0 = 0x0
1 = 0x1
2 = 0x2
max = 0x7fffffff = 2147483647
min = 0x80000000 = -2147483648
正數與二進位制的相互轉換,就是簡單的二進位制與十進位制的相互轉換
負數與二進位制的相互轉換:
1)二進位制 -> 負數 :0x80000000 取反 0x7fffffff(2147483647) 忽略符號加一 (2147483648) 結果(-
2147483648
)2)負數 -> 二進位制 :
-2147483648 忽略符號減一(-
2147483647[
0x7fffffff
]) 取反(
0x80000000
) 結果(
0x80000000
)ps:以上就是專業術語"補碼"的含義,而補碼存在的意義在於:讓所有的加法能夠使用同一種電路完成
接下來就是四則運算:加減乘除
1,加法[全加器]
案例一:
3 + 5 = 8
==>
0 0 1 1 -> 3
+ 0 1 0 1 -> 5
----------
= 1 0 0 0 -> 8
因此可以看出,二進位制之間的加法就是,和小學學的十進位制的"尾數相加,然後進製
案例二:
1 + -1(0x7fffffff) = 0
==>
?_ 0 0 ... 1 -> 1
+?_ 1 1 ... 1 -> -1
--------------
=1_ 0 0 ... 0 -> 0
因此可以看出,二進位制之間的加法,最高位表示的不是具體的數值,進製之後應該被捨去
2,減法
[全加器]
減法可以實現的方案:1)類似十進位制的減法直接去位 2)減法就是另類的加法
而計算機採用的是,方法2,原因:直接可以使用全加器
例如:a - b = a + (-b)
而通過之前的準備可以看出:二進位制中,b的負數就是b的補碼
因此,0xa - 0xb = 0xa + 0xb(補碼[取反,忽略符號加一])
3,乘法[乘法器,晶元]
乘法可以實現方案:1)
類似十進位制的乘法
2)多個加法
而計算機採用的是,方法1,原因:多個加法的演算法複雜度成二次方增長
案例一:
3 * 5 = 15
==>
0 0 1 1 -> 3
* 0 1 0 1 -> 5
-------------
0 1 0 1 -> 5
+ 0 1 0 1 -> 10
-------------
1 1 1 1 -> 15
ps:
1)如果有符號,符號位另算,即:同號得正,不同號得負原則
2)如果有位數移除,則高位直接捨去,然後得出剩下的二進位制對應的值
4,除法[晶元]
除法可以實現方案:1)類似十進位制的除法 2)多個減法,直到負數
而計算機採用的是,方法1,原因:多個減法的演算法複雜的成二次方增長
14 / 3 = 4 餘 2
14(1110[被除數])、3(11[除數])、4([結果])、2([餘數])
==>
1 0 0 --> 結果[4]
-----------
1 1 / 1 1 1 0
---------------
1 1---------------
0 1---------------
1 0---------------
1 0 --> 餘數[2]
ps:
1)如果有符號,符號位另算,
即:同號得正,不同號得負原則
回顧之前的問題,公式溢位問題:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
就很容易解釋了,
1,31^(n-1)的結果,高位會被省去
2,加法結果的結果,高位會被省去,這也是為什麼會計算出負數的原因
二進位制移位實現加減乘除
如何使用位操作分別實現整數的加減乘除四種運算?需要熟練掌握一些常見功能的位操作實現,具體為 1 常用的等式 n n 1 n 1 2 獲取整數n的二進位制中最後乙個1 n n 或者 n n 1 如 n 010100,則 n 101100,n n 000100 3 去掉整數n的二進位制中最後乙個1 n ...
關於二進位制加減
題目 接受使用者輸入的0 1字串 最長20位 檢查使用者輸入是否合法 二進位制字串只能由 或 組成 如不合法,報錯退出 如合法,返回兩者相加結果 二進位制相加 思路 先對使用者輸入的數字存進陣列中進行判斷是否為0 1字串。判斷之後把二進位制轉為十進位制再計算,計算後逆序輸出。include incl...
計算機 加減乘除原理 二進位制運算 PHP 位運算
位運算 加法實現 核心 逢二進一 param int a 被加數 param int b 加數 return int 和 function add int a,int b int if xor return add and 1,xor 位運算 減法實現 核心 加法逆運算 param int a 被減...