計算機中資料的儲存方式,是以二進位制的方式進行儲存。位運算的左移和右移一般代表數的乘除,但不同的資料乘除方式所獲得的結果,不盡相同。一般位移時,空的位置以0作為補充。
關於計算機中資料的儲存方式在這裡不做說明,這裡只說明資料的換算關係:
位運算左移<< 屬於乘法關係
無論是奇數還是偶數,位運算左移時(<<),均代表當前數值乘以2的幾次方,而這個幾次方和移動的位數是相同的。簡單舉個例子,如果定義乙個數5,那麼在計算機中進行左移1位時,得到的數就是10,左移兩位得到的數就是20,左移3位得到的數是40。
大家有興趣的就去算一下,假定a對應的二進位制的位數不做限制,那麼左移n位,最後得到的數值應該為a*(2的n次方),這裡可以用位運算左移來進行數值的乘以2的運算
下面以一段非正式c++程式語言來進行相應演示
/*定義乙個字元型別的數字5,由於字元型變數在計算機中只占用1個位元組,也就是8位,數字5對應的二進位制為0b0000 0101
1)假如向左移動1位,則得到的二進位制為0b0000 1010,換算成十進位制的數字就是10
2)假如向左移動2位,則得到的二進位制為0b0001 0100,換算成十進位制的數字就是20
3)假如向左移動3位,則得到的二進位制為0b0010 1000,換算成十進位制的數字就是40
*/char a;
a<<=1;//表示a進行向左移一位的位運算
std::cout《位運算右移》
相對於左移的位運算,位運算右移則一般表示對2的除法。但對奇、偶數的位移不盡相同。
當右移的數值是偶數時,右移一位,則表示當前數字除以2,例如,數字是6(對應二進位制110),向右位移一位時,得到的結果是3(對應二進位制011)。
特別注意,當右移的數值是奇數時,右移一位,則最低位的數字一定會被捨去。例如數字是5(二進位制101),右移1位,得到的數字卻是2(010)。再舉乙個例子,數字63(二進位制111111),右移一位得到31(011111),再右移一位得到15(001111),再右移一位得到7(000111)……
這裡也以一段**進行演示:
char a;
a>>=1;//表示a進行向左移一位的位運算
std::cout《看到這裡可以得到結論是,無論是奇數還是偶數,進行右移時,得到的結果是這個數除以2的商(但奇數字移後的餘數會被捨去)。假如要用位運算右移來代替除法運算時,需要考慮
a. 當前數字是偶數時,位移幾位後,得到的商是奇數
b. 當前數字是奇數時,假如需要還原位移的數字時,需要低位進行補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編譯器,用...
計算機中整數的加減運算
通常在程式設計時,會預設將指標以及位址等說明為無符號整數,故其遵循無符號整數的加減運算。在其他情況下面,通常都是進行帶符號的整數運算,但是這兩種運算的本質其實是相通的,因為在計算機內部,這些有無符號整數的加減或者乘除操作其實都是通過相同的加法器來完成的 在加法器內部通過輸入進行判斷是輸出無符號還是有...
計算機中的邏輯運算
計算機中的邏輯運算又被稱作為 布林運算 分別為 邏輯與運算 邏輯或運算,邏輯非運算,邏輯異或運算。此外在閘電路中還有 同或運算 與非運算 或非運算。共七種。這七種邏輯運算中,只有 邏輯非運算 是一元邏輯運算 乙個運算引數 其他六種均是二元邏輯運算 兩個運算引數 邏輯運算只有兩個布林值 邏輯與運算,運...