LeetCode-476 Number Complement


Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

Note:

  1. The given integer is guaranteed to fit within the range of a 32-bit signed integer.
  2. You could assume no leading zero bit in the integer’s binary representation.

Example 1:

Input: 5
Output: 2
Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.

Example 2:

Input: 1
Output: 0
Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

原码、反码、补码的关系:

正数:反码 = 原码。

负数:反码 = 符号位不变,其余位取反。

补码 = 反码+1

补码:计算机中使用的是补码,而不是原码或反码。

   为什么使用补码呢?

进行运算时,可以统一加减法(时钟原理、补码概念)。另外可以让符号位作为数值直接参与计算。

   为什么不使用原码呢? 

1. 使用原码的话,表示0时会出现二义性,[+0]原=00000000,[-0]原=10000000,

     2. 使用原码进行运算时,符号位需要单独处理

反码只是作为补码和原码之间的桥梁

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


我的方法虽然通过了,但是感觉实在是太丑陋了,耗时29ms。
public class Solution {
    public int findComplement(int num) {
       int result=0;
       int count=0;
       int [] biresult = new int[32];
       boolean flag = false;
       StringBuilder sb = new StringBuilder();
       while(a!=0){
       	   result= a%2;
	   System.out.println("result: "+result);
	   biresult[count]=result^1;
	   count++;
	   a=a/2;
	}	
	if(count ==1){
           System.out.println(biresult[count-1]);
	}	
	if(count >1){	
	   for(int i= count-1;i>=0;i--){
	       if(!flag && biresult[i] !=0){
	       	    flag = true;
		}
		if(flag){
	            sb.append(biresult[i]);
	     	}
	    }
	    if(!flag){
		sb.append(0);
	    }
	
	}	
	return Integer.parseInt(sb.toString(),2);
    }
}

太丑陋了!!!!
比较好的方法如下,耗时9ms:
public class Solution {
    public int findComplement(int num) {
        int complementary = 0;
        int i = 31;
        while(((1<<i) & num)==0) i--;
        while(i >= 0){
            int mask = (1 << i);
            int value = mask & num;
            if(value == 0) complementary |= mask;
            i--;
        }
        return complementary;
    }
}

(1<<i) & num:找到lead位置
mask:左移leader位于num相与。如果与后结果为0,则表示位与num的位相反,然后与将要返回的结果做或操作,添加的结果的i位。
返回结果。

需要学习的地方:
1. 可用左移与的操作找到leader位。
2. mask的使用



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值