位操作(Bit Manipulation)—— Number Complement

目录

题目:

思路:

要点:

1、如何计算取反?

2、如何计算掩码?

3、如何计算上述valid(num最高位1所在的位置)?

解法:


题目:

思路:

首先计算取反的结果,然后计算掩码,最后将两者相与。

要点:

1、如何计算取反?

利用运算符 ~

2、如何计算掩码?

首先计算num最高位1所在的位置,valid;然后利用mask = (1<<valid)-1计算掩码,这是一种常用的方式。

或者可以直接利用java自带的函数计算;Integer.highestOneBit(num);这个函数是只保留num最高位的1,而把低位都置为0;比如100101——>100000;所以此时掩码的计算方式:(Integer.highestOneBit(num)<<1)-1;

3、如何计算上述valid(num最高位1所在的位置)?

利用num不断右移(这里num是正数,可以右移)见程序。

解法:

class Solution {
    public int findComplement(int num) {
        return helper1(num);
        //return Integer.highestOneBit(num);
        //结果为4,所以这个函数的返回值是指将一个数的最高为1保留,低位全部置为0,对于5(101)结果为4(100)
    }
    
    /*
        首先计算num的最高位1所在的位,因为是正数,可以利用num右移实现。
        计算掩码,利用1左移实现。
        对原数字num取反(~),在和掩码进行与运算。
    */
    private int helper0(int num){
        int n = num;
        int valid = 0;
        while(n>0){
            n = n>>1;
            valid++;
        }
        int mask = (1<<valid) - 1;//因为1本身已经占了1位,所以只需要移动valid位,在减1即可。注意优先级的问题
        return (~num)&(mask);
    }
    
    /*
        (1<<valid)-1是常用的求掩码的方式
         return ~num & ((Integer.highestOneBit(num) << 1) - 1);
    */
    private int helper1(int num){
        //return (~num)&((1<<Integer.highestOneBit(num))-1); 这个函数的返回值的意义跟这里的valid不同
        return ~num & ((Integer.highestOneBit(num) << 1) - 1);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_24888697/article/details/82179397
今日推荐