class Solution {
public int findComplement(int num) {
int s = -1;
for (int i = 30; i >= 0; i--) {
if (((num >> i) & 1) != 0) {
s = i;
break;
}
}
int ans = 0;//不一定要在num上取反
for (int i = 0; i < s; i++) {
//因为原来ans都是0,所以当num位取1的时候跳过
//取0的时候,将0改成1
if (((num >> i) & 1) == 0) ans |= (1 << i);
}
return ans;
}
}
思路来自于三叶
【宫水三叶】一题双解 :「遍历」&「lowbit」 - 数字的补数 - 力扣(LeetCode) (leetcode-cn.com)