C的移位位運算符。移位運算符向左或向右移動位。
1.左移:<<
左移運算符(<<)將其左側運算對象每一位的值向左移動其右側運算對象指定的位數。
左側運算對象移出左末端位的值丟失,用0填充空出的位置.
下面例子中,每一位都向左移動兩個位置:
(10001010) << 2 //表達式
(00101000) << 2 //結果值
該操作產生了一個新的位值,但是不改變其運算對象。例如,假設stonk為1,那么stonk << 2為4,但是stonk本身不變,仍為1。
可以使用左移賦值運算符(<<=)來更改變量的值。
該運算符將變量中的位向左移動其右側運算對象給定值的位數,如下例:
int stonk = 1; int onkoo; onkoo = stonk << 2; /* 把4賦值給onkoo */ stonk <<= 2; /* 把stonk的值改為4 */
2.右移:>>
右移運算符,將其左側運算對象每一位的值向右移動其右側運算對象指定的位數。
左側運算對象移出右末端位的值丟失。
對於無符號類型,用零填充空出的位置;對於有符號類型,其結果取決於機器。
空出的位置可用0填充,或者用符號位(即最左端的位)的副本填充:
(10001010)>> 2 //表達式,有符號值
(00100010) //在某些系統中的結果值
(10001010)>> 2 //表達式,有符號值
(11100010) //在另一些系統上的結果值
下面是無符號值的例子:
(10001010)>> 2 //表達式,無符號值
(00100010) //所有系統都得到該結果值
每個位向右移動兩個位置,空出的位用0填充。
右移賦值運算符(>>=)其左側的變量向右移動指定數量的位數,如下所示:
int sweet = 16; //二進制值為:0001 0000
int ooosw; ooosw = sweet >> 3; // 右移三位2進制值W為:0000 0010, 十進制ooosw = 2,sweet的值仍然為16
sweet >>=3; //sweet的值為2 ‘>>=’是右移賦值運算符
3.用法:移位運算符
移位運算符針對2的冪提供快速有效的乘法和除法:
number << n num乘以2的n次冪
number >> n 如果number為非負,則用number除以2的n次冪
這些移位運算符,類似於在10進制中,移動小數點來乘以10或除以10。
移位預算符還可以用於較大單元中提取一些位。例如用一個unsigned long類型的值表示顏色值,低階位字節存儲紅色的強度,下一個字節存儲綠色的強度,第3個字節存儲藍色的強度。
隨后你希望把每種顏色的強度分別存儲在3個不同的類型的變量中,那么可以使用你下面的語句:
#define BYTE_MASK 0xff unsigned long color = 0x002a162f; unsigned char blue, green, red; red = color & BYTE_MASK; green = (color >> 8) & BYTE_MASK; blue = (color >> 16) & BYTE_MASK;
以上代碼中使用右移運算符,將8位顏色值移動至低階字節,然后使用掩碼技術把低階字節賦值給指定的變量。