利用位运算求数字的补数

题目

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

注意

1.给定的整数保证在32位带符号整数的范围内。
2.假定二进制数不包含前导零位。

解题思路

求出一个与输入数字在二进制位的数量上相同,且每位都为1的数字,之后利用该数字和输入的数字做异或操作,即可得出补数。

例如

2的二进制为10,和他二进制位数相同,且全为1的十进制数为3,即二进制11。2与3做异或操作,得到二进制01,这也就是2的补数1。

代码

#include <stdio.h>

int main(void)
{
    int in = 0;
    int tmp = 1;

    scanf("%u", &in);

    // 不断将tmp左移并在末尾填充1,当tmp的位数与in相同时tmp大于in,循环终止。
    while (tmp < in) {
        tmp <<= 1;
        tmp += 1;
    }

    printf("%u\n", tmp ^ in);
}