目录
题目:
略
思路:
首先计算取反的结果,然后计算掩码,最后将两者相与。
要点:
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);
}
}