位運算實現乘除法

2021-10-23 22:26:47 字數 2597 閱讀 5415

對於任何十進位制正整數 k :

設其二進位制為 「bn…b2b1b0」(其中 bi 為二進位制某位值,i∈[0,n] )

二進位制數:k = b0 * 2^0 + b1 * 2^1 + b2 * 2^2 + … + bn * 2^n

故乘二有:k = b0 * 2^1 + b1 * 2^2 + b2 * 2^3 + … + bn * 2^(n+1)

即左移一:k = 00 * 2^0 + b0 * 2^1 + b1 * 2^2 + … + bn * 2^(n+1)

同理除二:k = b0 *2^-1 + b1 * 2^0 + b2 * 2^1 + … + bn * 2^(n-1)

即左移一:k = b1 * 2^0 + b2 * 2^1 + b3 * 2^2 + … + bn * 2^(n-1)

舍最低位:k = (整數除) + b1 * 2^0 + b2 * 2^1 + … + bn * 2^(n-1)

根據以上可知:

除2 = 右移1位; 乘2 = 左移1位

除4 = 右移2位; 乘4 = 左移2位

除8 = 右移3位; 乘8 = 左移3位

通常如果需要乘以或除以2的n次方,都可以用移位的方法代替,大部分的c編譯器,用移位的方法得到**比呼叫乘除法子程式生成的**效率高。 實際上,只要是乘以或除以乙個整數才可以用移位的方法得到結果。

例如:a=a*9 => a=a*(8+1) => a=a*8 + a*1 => a=(a<<3)+a

a=a*7 => a=a*(8–1) => a=a*8 – a*1 => a=(a<<3)–a

a=a*7 => a=a*(4+2+1) => a=a*4 + a*2 + a => a=(a<<2)+(a<<1)+a

a=a*10 => a=a*(8+2) => a=a*8 + a*2 => a=(a<<3)+(a<<1)

long

long

multiple

(int num1,

int num2)

bool sign =

false;if

(num1 <

0&& num2 <0||

num1 >

0&& num2 >0)

long

long first =

abs(

(long

long

)num1)

;long

long second =

abs(

(long

long

)num2);if

(first < second)

//兩個int相乘不能超過乙個longlong的範圍,防溢位

long

long ans =0;

for(size_t i =

0; i <

32; i++)}

return sign ? ans :

-ans;

}

位移配合相減實現,例如:91(1011011) / 14(1110) 的過程如下:

被除數字數

減除數結果商餘數

左移11不夠減01

10010不夠減010

1011

101不夠減

0101

1011

11011

不夠減0

1011

10110

010110夠減1

1000

10001

110001夠減1

11111

1111

不夠減0

111完畢

所以有:1011011 = 1110 * 0000110 + 111 。

也就是:91 = 14 * 6 + 7。

過程實現如下:

long

long

divide

(int dividend,

int divisor)

bool sign =

false;if

(dividend <

0&& divisor <0||

dividend >

0&& divisor >0)

long

long first =

abs(

(long

long

)dividend)

;long

long second =

abs(

(long

long

)divisor);if

(first < second)

long

long bit_sum =1;

int first_bit_count =0;

while

(bit_sum <= first)

long

long ans =0;

long

long remainder =0;

while

(first_bit_count--)}

return sign ? ans :

-ans;

}

位運算乘除法

1 無符號除法 i.定點除法 對於n位dividend和divisor 1 擴充為2n 1位,但是擴充方向不一致,被除數是 000.nd 而除數是 divisor 000.2 如果dividend divisor,則dividend divisor quotient置 1 然後divisor向右移動...

用位運算實現除法

複習一下 被除數 除數 商.餘數累減 最簡單的就是不斷地用被除數減去除數,直到被除數小於除數,此時減的次數就是商 加權累減 假設現在要計算a b,a為a位的二進位制數,b為b位的二進位制數 1 將b左移a b位,變成乙個a位的二進位制數b 與a的位數一樣 2 如果a大於等於b 則令a a b 商累加...

C C 中移位實現乘除法運算

用移位實現乘除法運算 a a 4 b b 4 可以改為 a a 2 b b 2 說明 除2 右移1位 乘2 左移1位 除4 右移2位 乘4 左移2位 除8 右移3位 乘8 左移3位 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的c編譯器,用移位的方法得到 比呼叫乘除法子程式生成的...