位运算实用方法

1、一些应用技巧

(1) 判断int型变量a是奇数还是偶数           

a&1   = 0 偶数

       a&1 =   1 奇数

(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1

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

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

2、交换变量

常规的交换变量的方法需要一个临时变量:tmp=null; tmp = a; a=b;b=tmp;

位运算: a^=b;b^=a;a^=b; 不需要额外的变量即可交换两者,原理是:

由等式1、2可得:b = b^a^b;由于任何值异或本身均为0,任何值异或0为其本身,故 b=a;

故等式3为: a = a^b^a; 即a=b;

3、正数变为负数、负数变为正数(涉及到反码、补码、原码的概念和转换问题,请自行脑补)

    a = -1; 

    function convert(int a){return ~a+1; }

    convert(a);

4、取符号位(负数为-1, 正数为0)

    a>>31

5、乘以2(当然也可以乘以4、8等)

    a<<1

6、除2

    a>>1

7、比较两整数的大小(返回值 0:等于 1大于 -1小于)  第二行没看懂原理

    function compareInt(a, b){

        if(a^b == 0){return 0;}

        if ( ( (a + (~(b & 0x7fffffff)) ^ a) & (((~a) | b)) ) >>31 ) {return -1};

        return 1;

    }

8、消支最后一位1(仅限最后一位为1的数字,否则会出现不可控的数字)

    x&(x-1)

9、应用于数组中,有一个数只出现了一次,其它的数都出现2的位数次,找出出现一次的数

    a^b^c = a;

猜你喜欢

转载自my.oschina.net/jiangchike/blog/1629969