1. 程式人生 > >【C語言/C++】算術移位和邏輯移位以及一道移位的題目

【C語言/C++】算術移位和邏輯移位以及一道移位的題目

算術移位和邏輯移位

基本概念

邏輯移位:移位所缺少的數字用“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