移位實現的乘除法比直接乘除的效率高很多。
用移位實現乘除法運算
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編譯器,用移位的方法得到**比呼叫乘除法子程式生成的**效率高。
實際上,只要是乘以或除以乙個整數,均可以用移位的方法得到結果,如:
a=a*9
分析a*9可以拆分成a*(8+1)即a*8+a*1, 因此可以改為: a=(a<<3)+a
a=a*7
分析a*7可以拆分成a*(8-1)即a*8-a*1, 因此可以改為: a=(a<<3)-a
關於除法讀者可以類推, 此略.
乙個自己曾經忽視的東西,那就是c/c++中的移位操作容易出錯的情況。
1、什麼樣的資料型別可以直接移位
char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以進行移位操作,而double、float、bool、long double則不可以進行移位操作。
2、有符號資料型別的移位操作
對於char、short、int、long這些有符號的資料型別:
對負數進行左移:符號位始終為1,其他位左移
對正數進行左移:所有位左移,即 <<,可能會變成負數
對負數進行右移:取絕對值,然後右移,再取相反數
對正數進行右移:所有位右移,即 >>
3、無符號資料型別的移位操作
對於unsigned char、unsigned short、unsigned int、unsigned long這些無符號資料型別:
沒有特殊要說明的,使用<< 和 >> 操作符就ok了
結束語8086 中存在邏輯移位、算術移位,而c/c++中的移位似乎既不是邏輯移位,也不是算術移位。
比如-1,我們若對它右移1位,c的結果仍舊是-1,事實上無論右移多少位始終是-1,邏輯移位得到的結果(8位表示)應該是-128,所以這點要注意
頂 1 踩
移位乘除法
移位實現的乘除法比直接乘除的效率高很多。用移位實現乘除法運算 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編譯器,用...
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編譯器,用移位的方法得到 比呼叫乘除法子程式生成的...
使用移位運算和加減法實現乘除法
這個想法是在做leetcode 的題目29 divide two integers時產生的,原題描述如下 divide two integers without using multiplication,division and mod operator.if it is overflow,retu...