c語言左移和循環左移的區別?
在C中,左移是邏輯算術,右移是算術右移,會保持符號位不變.
實際應用中可以根據情況用左/右移做快速的乘/除運算,這樣會比循環效率高很多.
1、左移就是把一個數的所有位都向左移動若干位,在C中用<<運算符.例如:
int i = 1;
i = i << 2; //把i里的值左移2位
也就是說,1的2進制是000...0001(這里1前面0的個數和int的位數有關,32位機器,gcc里有31個0),左移2位之后變成 000...0100,也就是10進制的4,所以說左移1位相當于乘以2,那么左移n位就是乘以2的n次方了。
2、右移對符號位的處理和左移不同,對于有符號整數來說,比如int類型,右移會保持符號位不變,例如:
int i = 0x80000000;
i = i >> 1; //i的值不會變成0x40000000,而會變成0xc0000000
就是說,符號位向右移動后,正數的話補0,負數補1,也就是匯編語言中的算術右移.同樣當移動的位數超過類型的長度時,會取余數,然后移動余數個位.