二進位制移位實現加減乘除

2021-07-10 09:40:48 字數 1419 閱讀 2232

如何使用位操作分別實現整數的加減乘除四種運算?

需要熟練掌握一些常見功能的位操作實現,具體為:

<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&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000

(1) 加法實現

可以很容易地用「異或」和「或」操作實現整數加法運算:對應位數的「異或操作」可得到該位的數值,對應位的「與操作」可得到該位產生的高位進製,如:a=010010,b=100111,計算步驟如下:

第一輪:a^b=110101,(a&b)<<1=000100, 由於進製(000100)大於0,則進入下一輪計算,a=110101,b=000100,a^b=110001,(a&b)<<1=001000,由於進製大於0,則進入下一輪計算:a=110001,b=001000,a^b=111001,(a&b)<<1=0,進製為0,終止,計算結果為:111001。

**如下:

intadd(

inta,

intb)

while

(carry != 0);

return

add;}

(2) 減法實現

減法可很容易地轉化為加法:a - b = a + (-b) = a + (~b + 1 )

**如下:

intsubtract(

inta,

intb)

(3) 乘法實現

先看乙個例項:1011*1010:

1011

* 1010

----------

10110 < 左移一位,乘以0010

+ 1011000 < 左移3位,乘以1000

----------

1101110

因而乘法可以通過系列移位和加法完成。最後乙個1可通過b&~(b-1)求得,可通過b& (b-1)去掉,為了高效地得到左移的位數,可提前計算乙個map,**如下:

intmultiply(

inta,

intb)

if(neg)

sum = -sum;

return

sum;}

(4) 除法實現

乘法可很容易轉化為減法操作,主要思想與乘法實現類似,**如下:

intdivide(

inta,

intb)

intq = 0;

for(

inti = msb; i >= 0; i--)

if(neg)

return

-q;returnq;}

Java二進位制的加減乘除

引子 某天研究 fail fast機制的時候,去看了看hashcode的實現方式,然後發現每個物件的實現都不一樣 於是研究乙個string的 於是看到公式 s 0 31 n 1 s 1 31 n 2 s n 1 於是很不解,這個公式很明顯會溢位 超過2 32 嘗試了幾次發現系統會輸出hashcode...

python二進位制移位 python移位運算的實現

密碼演算法程式設計實踐選的sha 1。在寫的過程中遇到一丟丟關於python移位的問題,記錄一下。sha 1其中第一步需要填充訊息。簡單闡述一下sha1填充訊息的過程 如輸入訊息 123 先轉成ascii碼 313233,訊息長度為3 8 24。即00110001 00110010 00110011...

關於二進位制加減

題目 接受使用者輸入的0 1字串 最長20位 檢查使用者輸入是否合法 二進位制字串只能由 或 組成 如不合法,報錯退出 如合法,返回兩者相加結果 二進位制相加 思路 先對使用者輸入的數字存進陣列中進行判斷是否為0 1字串。判斷之後把二進位制轉為十進位制再計算,計算後逆序輸出。include incl...