476. Number Complement

链接

476. Number Complement

题意

给定一个正整数,输出它取反后的十进制数
注意:

  1. 给定的正整数在32个字节范围内
  2. 正整数的二进制表示没有前导0(即5表示为101,前面不加0)

思路

不能直接对给定数取反,因为要从最高位的1开始向后按位取反

代码

C:

// 逐位取反
#include <math.h>
int findComplement(int num) {
    int ans = 0;
    int i = 0;
    while(num) {
        ans += (!(num & 1) * pow(2.0, i++));
        num >>= 1;
    }
    return ans;
}

Java:

/**
 *  构造一个和给定数位数相等的掩码(mask-1后每一位都是1)
 *  然后对num进行异或操作(即按位取反)
 */
public class Solution {
    public int findComplement(int num) {
        int mask = 1;
        int t = num;
        while(t > 0) {
            mask <<= 1;
            t >>= 1;
        }
        return num^(mask-1);
    }
}
原文地址:https://www.cnblogs.com/zyoung/p/6541975.html