位运算符

181 阅读2分钟

1.&(与)——两数二进制相交的位数

A.例子

    0 & 0 = 0
    0 & 1 = 0
    1 & 0 = 0
    1 & 1 = 1

B.用途

    a.清零(让一个数迅速变为0)   
        例子:
            1110 & 0 // 0

    b.取一个数的指定位
        例子:
            1110 & 1111  //1110

    c.判断奇偶
        例子:
            奇数 & 1 // 1
            偶数 & 1 // 0

2.|(或)——两数二进制相并的位数

A.例子

    0|0=0  0|1=1  1|0=1  1|1=1

B.用途

    a.数据的一些位置设置为1
        例子:
            1110|1111 // 1111

3.^(异或)——相同为0,不同为1

A.例子

    0 ^ 0 = 0  
    0 ^ 1 = 1
    1 ^ 0 = 1
    1 ^ 1 = 0

B.用途

4.#(猜想:不存在的符号)——相同为1,不同为0

A.例子

    0 # 0 = 1  
    0 # 1 = 0  
    1 # 0 = 0  
    1 # 1 = 1

B.用途

5.~(取反)——1反为0,0反为1

对补码进行了取反(包括符号位)

A.例子

    ~1=0
    ~0=1

B.用途:

6.<<(有符号左移)

正数:相应的补码左移,从右往左补零
负数:原码转反码,反码转补码,除符号位,左移,然后从右往左补1,补码转反码,反码再转成原码

A.例子

    5 << 1 // 10
        解释:
            5           10
            00000101 => 00001010

B.用途

7.>>(有符号右移)

正数:相应的补码右移,从左往右补零
负数:原码转反码,反码转补码,除符号位,右移,然后从左往右补1,补码转反码,反码再转成原码

A.例子

    5 >> 1 // 2
        解释:
            5           2
            00000101 => 00000010

B.用途

8.<<<(无符号左移)

正数:原码转补码,直接进行左移,从右到左补零
负数:原码转补码,直接进行左移,从右往左补零,不转原码,直接输出

9.>>>(无符号右移)

正数:原码转补码,直接进行右移,从左到右补零
负数:原码转补码,直接进行右移,从左往右补零,不转原码,直接输出

10.复合运算符(组合表示)

    &=       例:a&=b    相当于     a=a&b

    |=       例:a|=b    相当于     a=a|b

    >>=      例:a>>=b   相当于     a=a>>b

    <<=      例:a<<=b   相当于     a=a<<b

    ^=       例:a^=b    相当于     a=a^b

11.实用技巧(随笔)

    以x为例:
        A.取相反数 // ~x + 1
        B.判奇偶   // {奇数 & 1 // 1}   {偶数 & 1 // 0}
        C.最低位为1的二进制(从右到左) // a&(-a)
            例子: 60  二进制为   111100
                   -60 二进制为  -111100
                   60 & (-60)为  4(0100)