题目
给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意
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); }