476. Number Complement(给一个数字求反)

来源:互联网 发布:java 中的super this 编辑:程序博客网 时间:2024/06/05 16:09


 

给定一个正整数,输出其补码。补码策略是翻转其二进制表示的位。

注意:
 

  1. 给定的整数保证在32位有符号整数的范围内。
  2. 您可以假定整数二进制表示中没有前导零位。

示例1:
 

输入: 5
 
输出:2
 
说明:5的二进制表示为101(无前导零位),其补码为010,所以需要输出2。

示例2:

输入: 1
  输出: 0

 说明:1的二进制表示为1(无前导零位),其补码为0.所以需要输出0。


 


 

好的解决方案是这样的,找到这个数从左边数第一个位1的位置,找到一个掩码从左边第一位开始都为1直到这个位置后,才这个位置一直到最右端都为0,然后掩码和这个数做或运算,然后取反.

                             2.也可以先给掩码取反然后和这个数做异或运算


 

这是第一种:

int findComplement(int num) {

int mask =(~0);

while(num & mask)

    mask <<= 1;

return ~(num | mask);

}



 

第二种:

int findComplement(int num) {

int mask =(~0);

while(num & mask)

    mask <<= 1;

    mask = (~mask);

return num ^ mask;

}