位运算应用

来源:互联网 发布:手机激光测距软件 编辑:程序博客网 时间:2024/06/04 01:10

位运算应用

按位移动: (>>, <<)。

按位与: (&)全一为一,否则为零。

应用:

1. 判断一个数的奇偶性。(x&1) 【101 & 1 = 1】
2. 判断x是否是2的正整数冪。(x&(x-1)) 【100 & 011 = 0】
3. 取出一个数的些二进制位。
    3.1.(x&(1 << (d-1)))【10101 & (1 << (3-1)) = 00100】取第d位
    3.2.(x&((1 << d)-1))【10101 & ((1 << 3)-1) = 00101】取最后d位, x对2^d取模
4. 取出一个数的最后一个二进制位1。(x & -x)【10100 & (01100) = 4】最后一个二进制位是第三位

/*******状态变化
得到一个数的所有少一个二进制位1的子集。
for( i = x ; i > 0 ; i -= (i & -i) )
        aim = x & ~(i & -1);
得到一个数的所有二进制子集。
for (i = x ; i > 0 ; i = (i - 1) & x)
        aim = i;
*******/

按位或: (|)有一为一,否则为零。

应用:

1. 将一个数的某些二进制位设为1。(x|(1 << (d-1)))

按位取反: (~)是一为零,是零为一。

按位异或: (^)不同为一,相同为零。

应用:

1. 将一个数的某些二进制位取反。(x^(1 << (d-1)))
2. 不使用中间变量交换两个数:a=a^b;b=a^b;a=a^b; 【可以理解:a = a^(b^b)  && b = (a^a)^b】



0 0