c語言中的移位運算符
移位運算符在程序設計中,是位操作運算符的一種。移位運算符可以在二進制的基礎上對數字進行平移。
c語言中提供瞭兩種移位運算符:
左移運算符:<<
右移運算符:>>
左移運算符(<<)
int main(void) { int a = 4; //把a的二進制位向左移動1位 int b = a << 1; printf("b = %d", b); return 0; }
在32位操作系統中,int類型占4個字節,1個字節有8bit,所以變量a在內存中占32個比特位。
將4賦值給變量a,a中存放的是4的二進制形式。
將a向左移動一位
最高位的0丟棄,末位補0
可以看到a左移一位後的結果是1000,轉換成10進制就是8,所以打印b的結果就是8。
右移運算符(>>)
int main(void) { int a = 10; //把a的二進制位向右移動1位 int b = a >> 1; printf("b = %d", b); return 0; }
把10賦值給變量a,將10表示成二進制形式
將10向右移動一位,最低位的0丟棄
最高位補0
最後的結果轉換成10進制就是5
我們可以看到最後打印b的結果確實是5。
這裡需要註意的是,右移分為算數右移和邏輯右移
算數右移: 右邊丟棄,左邊補原符號位
邏輯右移: 右邊丟棄,左邊補0
內存中存放二進制序列的時候,最高位是0表示正數,最高位是1表示負數。
因為10是正數,所以無論是算數右移還是邏輯右移,最高位都是補0。那麼這裡的右移運算到底是算數右移還是邏輯右移呢?
整數的二進制表示形式有三種:原碼、反碼、補碼
原碼:直接根據數值寫出的二進制序列
反碼:原碼的符號位不變,其他位按位取反
補碼:反碼加1
計算機內存數值存儲方式是補碼
int main(void) { int a = -1; //把a的二進制位向右移動1位 int b = a >> 1; printf("b = %d", b); return 0; }
以-1為例
-1的原碼:
-1的反碼:
-1的補碼:
因為計算機中存儲的是補碼,將-1右移1位,最低位的1舍棄
先來看b的打印結果
b的值為-1,說明最高位補的是1,此時進行的是算數右移。
需要註意的是,雖然a進行瞭右移操作,但是a的值是不發生改變的,我們可以將a也打印出來
int main(void) { int a = 10; //把a的二進制位向右移動1位 int b = a >> 1; printf("a = %d\n", a); printf("b = %d", b); return 0; }
a的結果仍然是10。
int a = 10; int b = a + 1;
和上面的代碼是一樣的,在進行移位運算的時候,移位對象的值並不會發生改變
到此這篇關於c語言中的移位運算符的文章就介紹到這瞭,更多相關c語言 移位運算符內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!