异或运算完成指定有效位取反(注意 带符号整数都是32位每位都会判断不能直接~)
如5:000000……0101
7
和:0000……0111异或
得到000……0 010=2
而且
若n二进制最高位1是第i位则n一定小于第2的i+1
我们找到i的位置,用(1<<i+1)-1和n异或就行
(或者找到第一个大于n的2的i次幂,再用其-1进行异或)
特殊情况
n==0时
我们i要是从0开始判断 1<<0,导致0^0=0
我们i从1开始算或者if(n==0)return 1;
注意区分i是n的有效位数还是有效位数加1
特殊情况n==30
这个只能用1<<31-1进行与运算也就是INT_MAX
2^31不存在溢出
class Solution {
public:int bitwiseComplement(int n) {int i =1;while (i <= 30){if (n <(1 << i))break;i++;}
int len=i-1;int mask = (len == 30 ? INT_MAX: (1 << (i)) - 1);//判断有效位数长度是不是30return n ^ mask;
}
};