题目:
对整数的二进制表示取反(0
变 1
、1
变 0
)后,转换为十进制表示,可以得到这个整数的补数。
~例如,整数 5
的二进制表示是 "101"
,取反后得到 "010"
,再转回十进制表示得到补数 2
。
给你一个整数 num
,输出它的补数。
********************************************************************************************************
1:暴力解:
使用一个字符串存储整数num的二进制,使用reverse函数,调整字符串的顺序,再将里面的数字取反,最后求出答案即可。
*******************************************************************************************************
2:使用左移右移解决:
根据题目要求求补码,可以使用数字的二进制和同样位数的1组成的字符串异或求得。
比如:
5的二进制101和111异或可求出5的补码为010;
可先求出num二进制最高位的那个1;比如:对于5来说,是100;
111可由100中的1再左移一位减去1求得,最后111和101异或求出答案
注意事项:
本题num的范围是
1 <= num <
当k为30时,求二进制最高位的1时,i<<k+1会发生越界。
所以:建立一个新字符串ans和num异或运算。
int ans=(k==30?(0x7fffffff:(i<<k+1)-1);可以解决越界问题。
0x7fffffff表示31个1,最高位
代码如下: