利用位運算求數字的補數

題目

給定一個正整數,輸出它的補數。補數是對該數的二進位制表示取反。

注意

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);
}