位运算详解

一、位运算的基础知识

1.1、基础位运算复习

<<:左移运算:将目标整数的二进制位左移x位,右边空出的位补0。

>>:有移运算:将目标整数的二进制位右移x位,左边补该补该目标整数的符号位。逻辑右移:左边补零。

~:按位取反:将目标二进制整数的二进制位进行安慰取反。

&:按位与运算:将两个整数的二进制位进行按位与只有两个二进制位的位全为1该位才为1,否则全为0。

|:按位或运算:将两个整数的二进制位进行按位或只有两个二进制位的位全为0该位才为0,否则全为1。

^:按位异或运算:将两个整数的二进制位进行按位异或只有两数的二进制位相同为0相异为1;或者这样理解:无进位相加。

1.2、一个整数的第x位是0还是1(位图)

举个例子:target:0110101001,x:3

解法:将target有移x位,然后&1得到的结果如果是0就是0,如果是1就是1。

target >> x=0000110101&1=1

所以第x位为1。

即将目标数右移x位后&1判断结果是0还是1即可。公式:

(target >> x) & 1

1.3、将一个整数的第x位修改成1(位图)

解法:target |= (1 << x)

1.3、将一个整数的第x位修改成0(位图)

解法:target &= (~(1 << x))

1.4、提取一个整数的最右侧的1(lowbit)

lowbit指的是将一个整数的二进制位的最右侧的1和1右侧的0全部进行保留,将该1左侧的数全部变成0。

公式:lowbit(x) = x & (-x)

解释:由于(-x)的补码一定是将x按位取反后再+1得到的所以最后一定是x的最右侧的1位置一定会变成0,当进行+1后改为会由于进位操作重新变成1,右侧的其余位全部为0,并且该为的左侧将全部为与x该位的左侧相反的,所以最终的结果一定是正确的。

举个例子:target:0110101001,x:3

-target=1110101001,补码:原码取反+1即1001010111

所以lowbit(target)=1

1.5、干掉一个数的最右侧的1

公式:n &= (n - 1)

1.6、异或运算的运算率

  1. a ^ 0 = a
  2. a ^ a = 0(消消乐)
  3. a ^ b ^ c = a ^ (b ^ c)(交换率)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值