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

本文介绍了一种高效算法来计算32位有符号整数的补码。通过找到第一个1的位置并创建一个掩码,可以实现快速翻转二进制位。提供了两种实现方法,一种使用按位或和取反操作,另一种使用按位异或。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


 

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

注意:
 

  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;

}


  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值