笨人笨方法,注意没有前导0这个条件。
特殊情况,num==0输出1
补码就是对自身取反,为什么~是不对的呢,因为这是考虑了有前导0的情况的,比如2,没有前导0就是10,补码就是01,如果有前导0的情况,取补码就是1111111111111…01这样了
我们先算出num有几位,然后用num来算res,将num的第一位给res的最后一位,如果第一位是1,res最后一位就是0。然后再左移res,最后res的最后一位就到第一位啦
class Solution {
public:
int findComplement(int num) {
int res = 0;
//可以先算出num有几位
int weishu = 0;
int tmp = num;
while(tmp != 0){
weishu++;
tmp >>= 1;
}
//然后对num右移操作,操作它前面的数给res加上,再对res左移
for(int i = weishu-1; i >= 0; --i){
res <<= 1;
if(((num>>i)&1) == 1){
res += 0;
}
else{
res +=1;
}
}
//不包含前导0,所以当num为0时就结束了
return res;
}
};