計算機中移位操作和乘除法的關係

2021-08-10 09:47:48 字數 1361 閱讀 2543

移位實現的乘除法比直接乘除的效率高很多。

用移位實現乘除法運算

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,所以這點要注意

主要是看到php中hash演算法用的是times33演算法,其思想是不斷乘以33,而給出的**是hash<<5+hash代替hash*33,因為33=2的5次方(32)+1,所以相當於hash*2的5次方+hash*1,轉換為移位運算則是hash<<5+hash.

計算機中的位運算和數值乘除關係

計算機中資料的儲存方式,是以二進位制的方式進行儲存。位運算的左移和右移一般代表數的乘除,但不同的資料乘除方式所獲得的結果,不盡相同。一般位移時,空的位置以0作為補充。關於計算機中資料的儲存方式在這裡不做說明,這裡只說明資料的換算關係 位運算左移 屬於乘法關係 無論是奇數還是偶數,位運算左移時 均代表...

基礎知識 計算機中的移位運算

移位運算子就是在二進位制的基礎上對數字進行平移。按照平移的方向和填充數字的規則分為三種 左移 帶符號右移 和 無符號右移 在移位運算時,byte short和char型別移位後的結果會變成int型別,對於byte short char和int進行移位時,規定實際移 動的次數是移動次數和32的餘數,也...

計算機中的定址

電腦的位數通常是指cpu的處理位數,這個不是靠位址匯流排來決定的,這個位數指的是cpu 通用暫存器的資料寬度,即cpu一次運算可以處理的資料bit長度。前面所說的是記憶體空間足夠的情況,下面用過一道軟考題目解釋記憶體空間 定址範圍的情況 某計算機字長32位,儲存容量8mb。按字編址,其定址範圍為 0...