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


 

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

注意:
 

  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;

}


  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值