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!

推薦閱讀: