Java二進位制的加減乘除

2021-08-15 17:46:01 字數 2463 閱讀 6188

引子

某天研究 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 被減...