原题链接
    题目描述:

    1. 给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
    2. 注意:
    3. 给定的整数保证在32位带符号整数的范围内。
    4. 你可以假定二进制数不包含前导零位。
    5. 示例 1:
    6. 输入: 5
    7. 输出: 2
    8. 解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2
    9. 示例 2:
    10. 输入: 1
    11. 输出: 0
    12. 解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0

    解:
    对于 00000101,要求补码可以将它与 00000111 进行异或操作。那么问题就转换为求掩码 00000111。

    1. public int findComplement(int num) {
    2. int temp = num, c = 0;
    3. while (temp > 0) {
    4. temp >>= 1;
    5. c = (c << 1) + 1;
    6. }
    7. return num ^ c;
    8. }