對於任何十進位制正整數 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的n次方,都可以用移位的方法代替,大部分的c編譯器,用移位的方法得到**比呼叫乘除法子程式生成的**效率高。 實際上,只要是乘以或除以乙個整數才可以用移位的方法得到結果。除2 = 右移1位; 乘2 = 左移1位
除4 = 右移2位; 乘4 = 左移2位
除8 = 右移3位; 乘8 = 左移3位
…
例如: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編譯器,用移位的方法得到 比呼叫乘除法子程式生成的...