左移、右移

來自ALSROBOT WiKi
2014年9月12日 (五) 13:35Admin討論 | 貢獻(xiàn)的版本

(差異) ←上一版本 | 最后版本 (差異) | 下一版本→ (差異)
跳轉(zhuǎn)至: 導(dǎo)航、 搜索

左移運(yùn)算(<<),右移運(yùn)算(>>)

描述

From The Bitmath Tutorial in The Playground


在C++中有兩個移位運(yùn)算符:左移運(yùn)算符<<和右移運(yùn)算符>>。這些運(yùn)算符將使左邊操作數(shù)的每一位左移或右移其右邊指定的位數(shù)。


語法

variable << number_of_bits 

variable >> number_of_bits 

參數(shù)<br>
 
*variable - (byte, int, long) number_of_bits integer <= 32 <br>


示例:<br>
    <pre style="color:green">
	int a = 5;        // binary: 0000000000000101
	int b = a << 3;   // binary: 0000000000101000, or 40 in decimal
	int c = b >> 3;   // binary: 0000000000000101, or back to 5 like we started with


當(dāng)把x左移y位(x << y),x中最左邊的y位將會丟失。

	int a = 5;        // binary: 0000000000000101
	int b = a << 14;  // binary: 0100000000000000 - 101中的第一個1被丟棄
 

如果您確信沒有值被移出,理解左移位運(yùn)算符一個簡單的辦法是,把它的左操作數(shù)乘2將提高其冪值。例如,要生成2的乘方,可以使用以下表達(dá)式:

    1 <<  0  ==    1
    1 <<  1  ==    2
    1 <<  2  ==    4
    1 <<  3  ==    8
    ...
    1 <<  8  ==  256
    1 <<  9  ==  512
    1 << 10  == 1024
    ...
 

當(dāng)把x右移y位,x的最高位為1,該行為依賴于x的確切的數(shù)據(jù)類型。如果x的類型是int,最高位為符號位,決定x是不是負(fù)數(shù),正如我們在上面已經(jīng)討論過的。在這種情況下,符號位會復(fù)制到較低的位:

	int x = -16;     // binary: 1111111111110000
	int y = x >> 3;  // binary: 1111111111111110

該行為,被稱為符號擴(kuò)展,常常不是你所期待的。反而,你可能希望移入左邊的是0。事實(shí)上右移規(guī)則對于無符合整型表達(dá)式是不同的。所以你可以使用強(qiáng)制類型轉(zhuǎn)換來避免左邊移入1。

	int x = -16;                   // binary: 1111111111110000
	int y = (unsigned int)x >> 3;  // binary: 0001111111111110
 

如果你可以很小心地避免符號擴(kuò)展,你可以使用右移位運(yùn)算符>>,作為除以2的冪的一種方法。例如

	int x = 1000;
	int y = x >> 3;   // 1000除以8,得y = 125.