【算法学习】编程中的位运算

位运算

位运算是直接对二进制的每一位进行逻辑操作的运算方式

用途:位运算一般用于考察异或的性质、状态压缩、与位运算相关的特殊数据结构、构造题等。

基本的位运算共 6 种,分别为按位与、按位或、按位异或、按位取反、左移和右移。

按位与 &

两个数字与运算的结果不会变小

按位或 |

两个数字或运算的结果不会变小

异或 ^

两个数字进行异或运算,结果可能变大,也可能变小,也可能不变。

异或的性质

// 交换律
x ^ y = y ^ x
// 结合律
x ^ (y ^ z) = (x ^ y) ^ z
// 自反性
x ^ x = 0
// 零元素
x ^ 0 = x
// 逆运算
如果x ^ y = z,则有 z ^ y = x (两边同时异或 y)

按位取反

常用于无符号数,避免符号位取反造成干扰

位运算技巧

判断数字奇偶性

表达式:x&1

如果结果位1说明是奇数,结果为0说明是偶数

获取二进制的某一位

表达式:x >> i & 1

结果必然为 0 或 1,表示x中第 i 位的值

修改二进制某一位

修改二进制某一位为1

表达式:x | (1 << i)

将x的第i位或上1,则x第i位变为1,其他位不受影响

修改二进制某一位为0

表达式:x & ~(1 << i)

其中~是按位非

判断一个数是否是2的幂次

表达式:x & (x - 1)

如果是2的幂次方,则其二进制中只有一个 1, x - 1就会有很多连续的1并且与x的1没有交集,两者与运算一定为0,其他情况必然不为 0 .

获取二进制中最低位的1

表达式 :lowbit(x) = x & -x

如果x=010010,则lowbit(x) = 000010

常用于数据结构树状数组

你可能感兴趣的:(算法学习,算法)