[LeetCode]476. Number Complement

来源:互联网 发布:淘宝助手打印快递单 编辑:程序博客网 时间:2024/05/29 12:05

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所在的位置,就可以构造一个长度和该数据所占位置一样长的一个掩码mask,然后该数和mask进行异或即可。

例如:5的二进制是101,我们的构造的掩码为mask=111,两者异或则为010,即是所要的结果。

public class Solution {    public int findComplement(int num) {            int mask,temp;        mask=1;        temp=num;                while(temp!=0)        {            mask=mask<<1;            temp=temp>>1;        }            return num^(mask-1);    }}


用字节的最高位表示符号的正负,0代表正,1代表负;但是这个符号位也会参与运算。


    (1) <<  运算规则:按二进制形式吧所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
    语法格式:
         需要移位的数字<<移位的次数
         例如:4<<2 ,则是将数字4左移2位
     计算过程
         4<<2
        Java中一个int数占四个字节,那么4的二进制数字为00000000 00000000 00000000 00000100,然后把该数字左移两位。其它的数字都朝右平移两位,最后在低位(右侧)的两个空位补零。则得到的最终结果是00000000 00000000 00000000 00010000,即转换为十进制数16。
         在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
         在溢出时,则不符合这个规律。


    (2)>>运算规则:按二进制形式吧所有的数字都向右移动对应的位置,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
     语法格式:
         需要移位的数字>>移位的次数
         例如:-4>>2和4>>2,则是将数字 -4和4右移2位
     计算过程
         4>>2
         Java中一个int数占四个字节,同样4的二进制为00000000 00000000 00000000 00000100,然后把该数字右移两位。其它的数字都朝左平移两位,最后在高位补符号位(该数是正数,全补零),得到的结果是00000000 00000000 00000000 00000001,即使十进制的1。数学意义就是右移移位相当于除2,右移n位相当于除以2的n次方。


原创粉丝点击