位运算应用
按位移动: (>>, <<)。
按位与: (&)全一为一,否则为零。
应用:
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取模
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的子集。
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】