思路:本题考查的是位操作:先从左到右找到第一个不为0的位置pos,然后将从0到pos位置的数字取反即可。
判断该位数字是否为1的方法是:先将数字右移到最后一位,然后和1相与,即可找到该位数字;
取反的操作可以利用异或:和1异或表示取反,和0异或表示保持数字不变。
class Solution {
public int findComplement(int num) {
int pos = -1;
// 找到合适的位置
for(int i=31;i>=0;i--){
if( ((num>>i) & 1) == 1){
pos = i;
break;
}
}
// 开始取反
for(int i=0;i<=pos;i++){
int mask = 1 << i;
num = num ^ mask;
}
return num;
}
}