& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
-------------------------------------------------------------
5 = 101
异或运算:1^0=1, 1^1=0, 0^0=0 所以 101^111=010=2
本题的关键是如何确定111,即如何确定有几个1。因为1的个数与5的二进制位数相等,所以问题变为如何确定5的二进制位数。
1.用数学运算方法确定 n = (int)(log(num)/log(2))+1
2.申请一个新的变量,通过位运算>>的方法确定位数
JAVA
class Solution { public int findComplement(int num) { int n = (int)(Math.log(num) / Math.log(2)) + 1; int bitmask = (1 << n) - 1; return num^bitmask; } }
class Solution { public int findComplement(int num) { int todo = num; int bitmask = 1; while(todo != 0){ num = num^bitmask; bitmask <<= 1; todo >>= 1; } return num; } }
Python3
class Solution: def findComplement(self, num: int) -> int: n = floor(log2(num))+1 bitmask = (1 << n) - 1 return num^bitmask
class Solution: def findComplement(self, num: int) -> int: todo = num bitmask = 1 while todo != 0: num = num^bitmask bitmask <<= 1 todo >>= 1 return num