【C語言/C++】算術移位和邏輯移位以及一道移位的題目
阿新 • • 發佈:2018-12-30
算術移位和邏輯移位
基本概念
邏輯移位:移位所缺少的數字用“0”來填充
算術移位:移位所缺少的數字用符號位來填充
C/C++中的移位
在C/C++中,整數分為有符號整數和無符號整數兩種
- 1 - 對於無符號數,採用邏輯移位,不論左移右移都用“0”填充;
- 2 - 對於有符號數,分左移和右移兩種情況
- 2a - 若為左移,則屬於邏輯運算,補“0”
- 2b - 若為右移,則屬於算術運算,補“符號位”
看一道有關位移的面試題
int main() { int a = 1; int b = 32; printf("%d %d\n", a << b, 1 << 32); return 0; }
大家先猜想一下,然後再看下面的結果
執行結果
通過結果,我們發現常量和變數的移位是有區別的
我們需要知道
對於常量,由於左移的位數大於了31位,所以結果為0
而對於變數,如果移位的位數 b 大於了該型別的大小 sz ,則先用b對sz取模,即 b = b % sz,然後再進行移位運算
驗證變數移位
我們定一個變數為-1,然後通過迴圈,使其分別左移1~33位
int main() { int a = -1; int b = 0; for (int i = b; i <= 33; ++i) printf("%d左移%.2d位 : 左移結果-> %11d\n", a , i, a << i); return 0; }
執行結果
常量移位這裡就不驗證了,只要移位超過31,就是0