1. 按位与运算

按位与运算符"&"是双目运算符。

其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。


2. 按位或运算

按位或运算符“|”是双目运算符。

其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

例如:9|5可写算式如下: 00001001|00000101

                                              00001101 (十进制为13)可见9|5=13

3. 按位异或运算

按位异或运算符“^”是双目运算符。

其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现。

例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)

    4. 求反运算

    求反运算符~为单目运算符,具有右结合性。 

    其功能是对参与运算的数的各二进位按位求反。实质就是对运算的数取反再减一

    5. 左移运算

    左移运算符“<<”是双目运算符。左移n位就是乘以2的n次方。

    其功能把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。

    1. 例: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

    2. 例:

    int i = 1;
    i = i << 2;  //把i里的值左移2位
    // 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)

    6. 右移运算

    右移运算符“>>”是双目运算符。右移n位就是除以2的n次方

    其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

    例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 


    7. 异或操作的妙用 


    1. 使特定位翻转     要使哪几位翻转就将与其进行∧运算的该几位置为1即可。

    2. 与0相∧,保留原值.

    3. 交换两个值,不用临时变量.

    我们可以在不用引入其他变量就可以实现变量值的交换

    用异或操作可以实现:

    a = a^b;          //(1)
    b = a^b;          //(2)
    a = a^b;          //(3)

    8. 位与运算

    1. 清零      A数中为1的位,B中相应位为0。然后使二者进行&运算,即可达到对A清零目的。

    2. 取一个数中某些指定位 取数A的某些位,把数B的某些位置1,就把数A的某些位与1按位与即可。

    3. 保留一位的方法     数A与数B进行&运算,数B在数A要保留的位1,其余位为零。

    4. 判断奇偶性 将变量 a的奇偶性。a与1做位与运算,若结果是1,则 a是奇数;将 a与1做位与运算,若结果是0,则 a是偶数。


    9、应用举例

    判断init型变量a是奇数还是偶数

    a&1 == 0 //偶数
    a&1 == 1 //奇数


    取int型变量a的第k位

    (k=0,1,2……sizeof(int)),即a>>k&1

    将int型变量a的第k位清0,即a=a&~(1<<k)

    将int型变量a的第k位置1, 即a=a|(1<<k)

    int型变量循环左移k次,即a=a<<k|a>>16-k   (设sizeof(int)=16)

    int型变量a循环右移k次,即a=a>>k|a<<16-k   (设sizeof(int)=16)

    整数的平均值

    function average(num1,num2){    return (num1&num2)+((num1^num2)>>1);}


    判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂

    function power2(num){    return ((num&(num-1))==0)&&(num!=0);}


    不用temp交换两个整数

    function(num1,num2){
        num1 = num1 ^ num2;
        num2 = num1 ^ num2;
        num1 = num1 ^ num2;
    }


    取整数 a>>0