LeetCode-476 Number Complement

来源:互联网 发布:手写英文识别软件 编辑:程序博客网 时间:2024/05/18 03:22


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: 5Output: 2Explanation: 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: 1Output: 0Explanation: 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的使用



原创粉丝点击