二級C++精品課程3-1-5:C++運算符之位運算符

字號:

3.1.5 位運算符
    C++提供6種位運算符,可以進行二進制位的運算,參見表3-7。
    位運算符要求操作數(shù)是整型數(shù),并按二進制位的順序來處理它們。取反運算符是單目運算符,其它位運算符是雙目運算符。取反運算符(~)將操作數(shù)的二進制位逐位取反。逐位與運算符(&)比較兩個操作數(shù)對應(yīng)的二進制位,當兩個二進制位均為1時,該位的結(jié)果取1,否則取0。逐位或運算符(|)比較兩個操作數(shù)對應(yīng)的二進制位,當兩個二進制位均為0時,該位的結(jié)果取0,否則取1。逐位異或運算符(^)比較兩個操作數(shù)對應(yīng)的二進制位,當兩個二進制位均為1或均為0時,該位的結(jié)果取0,否則取1。
    逐位左移運算符(<<)和逐位右移運算符(>>)均有一個正整數(shù)n作為右操作數(shù),將左操作數(shù)的每一個二進制位左移或右移n位,空缺的位設(shè)置為0或1。對于無符號整數(shù)或有符號整數(shù),如果符號位為0(即為正數(shù)),空缺位設(shè)置為0;如果符號位為1(即為負數(shù)),空缺位是設(shè)置為0還是設(shè)置為1,要取決于所用的計算機系統(tǒng)。
     表3-7 位運算符
     運算符 名字 實例
    ~ 取反 ~'\011' // 得出 '\366'
    & 逐位與 '\011' & '\027' // 得出'\001'
    | 逐位或 '\011' | '\027' // 得出'\037'
    ^ 逐位異或 '\011' ^ '\027' // 得出'\036'
    << 逐位左移 '\011' << 2 // 得出'\044'
    >> 逐位右移 '\011' >> 2 // 得出'\002'
    位操作運算符是用來進行二進制位運算的運算符。它分為兩類:邏輯位運算符和移位運算符。
    1、邏輯位運算符
    (1)單目邏輯位運算符:~(按位求反)
    作用是將各個二進制位由1變0,由0變1。
    (2)雙目邏輯運算符:&(按位與),|(按位或),^(按位異或)
    其中優(yōu)先級&高于^,而^高于|。
    & :兩個都為1時結(jié)果為1。
    | :兩個其中有一個為1則結(jié)果為1。
    ^ :兩個不同則結(jié)果為1,否則為0。
    2、移位運算符
    移位運算符有兩個,<<(左移)、>>(右移)。兩個 都是雙目運算符。
    例. 指出下面表達式的功能。
    (p&0377)|(k&0xff)<<8
    答:將整數(shù)p的低字節(jié)作為作為結(jié)果的低字節(jié),k的低字節(jié)作為結(jié)果的高字節(jié)拼成一個新的整數(shù)。
     針對兩個操作數(shù)011和027,表3-8給出各個位運算符的計算實例,運算結(jié)果在表3-7中。為了避免符號位的麻煩(它與機器有關(guān)),我們采用無符號的整數(shù)。
    unsigned char x = '\011';
    unsigned char y = '\027';
     表3-8 位運算符如何運算
     實例 10進制值 二進制值
    x 011 0 0 0 0 1 0 0 1
    y 027 0 0 0 1 0 1 1 1
    ~x 366 1 1 1 1 0 1 1 0
    x & y 001 0 0 0 0 0 0 0 1
    x | y 037 0 0 0 1 1 1 1 1
    x ^ y 036 0 0 0 1 1 1 1 0
    x << 2 044 0 0 1 0 0 1 0 0
    x >> 2 002 0 0 0 0 0 0 1 0
    位運算符要求操作數(shù)是整型數(shù),并按二進制位的順序來處理它們。位運算符除取反運算符'~'為單目運算符外,其余的都是雙目運算符,這可以從上面的表格中的表達式例子中看出來。具體說來:
    '&'為逐位與運算符,用于把兩個操作數(shù)對應(yīng)的二進制位進行邏輯與操作,邏輯與的操作上一節(jié)已經(jīng)作了介紹,這里不再贅述。所以0x011&0x001其實就是二進制數(shù)0000000000010001B 和二進制數(shù)0000000000000001B每一位都進行邏輯與運算,其結(jié)果必然是0000000000000001B 即0x001。
    '|'為逐位或運算符,用于把兩個操作數(shù)對應(yīng)的二進制位進行邏輯或操作。所以,根據(jù)邏輯或的運算規(guī)則,表達式0x011|0x001的結(jié)果必然是0x011。有興趣的同學可以自己把相應(yīng)的二進制位進行逐個的邏輯或運算,看看結(jié)果是不是0x011.。
    '^'為逐位異或運算符,用于把兩個操作數(shù)對應(yīng)的二進制位進行異或操作。因此,0x011^0x001的結(jié)果是0000000000010000B,即0x010。
    '<<'為逐位左移運算符,用于將左操作數(shù)的每一個二進制位左移右操作數(shù)位,空缺的位設(shè)置為0或1。對于無符號整數(shù)或有符號整數(shù),但符號位為0(即為正數(shù)),空缺位設(shè)置為0;如果符號位為1(即為負數(shù)),空缺位是設(shè)置為0,還是設(shè)置為1,要取決于所用的計算機系統(tǒng)。因此,0x011<<2 結(jié)果是0x044。
    '>>'為逐位右移運算符,將左操作數(shù)的每一個二進制位右移右操作數(shù)位,空缺的位設(shè)置為0或1,和逐位左移運算符一致。因此,0x011>>2的結(jié)果是0x004
    具體的運算的進行還可以參考表3-7位運算符如何運算。