目录
693. 交替位二进制数
【题目】:
【代码】:假如n=10(1010),(n>>1)=5(0101),n^(n>>1)=(1111),要么r是int类型最大值,要么r+1是2的幂。也可以直接return ((r+1)&r)==0;
class Solution {
public boolean hasAlternatingBits(int n) {
int r= n^(n>>1);
return isPowerOfTwo(r+1)|| r==Integer.MAX_VALUE ;
//return ((r+1)&r)==0; //ok
}
public static boolean isPowerOfTwo(int n) {
return n>0 && (n & n-1)==0;
}
}
效果:
476. 数字的补数
【题目】:
【代码】:
class Solution {
public int findComplement(int num) {
int temp=num; //5(00000101)
int mask=0;
while(temp!=0){
mask=(mask<<1)+1; //构造一个00000111的掩码
temp>>=1;
}
return num^mask; //00000101^00000111=00000010
}
}
效果:
方法2:可以利用 Java 的 Integer.highestOneBit() 方法来获得含有首 1 的数。
public int findComplement(int num) {
if (num == 0) return 1;
int mask = Integer.highestOneBit(num);
mask = (mask << 1) - 1;
return num ^ mask;
}
方法3:对于 10000000 这样的数要扩展成 11111111,可以利用以下方法:
mask |= mask >> 1 11000000
mask |= mask >> 2 11110000
mask |= mask >> 4 11111111
public int findComplement(int num) {
int mask = num;
mask |= mask >> 1;
mask |= mask >> 2;
mask |= mask >> 4;
mask |= mask >> 8;
mask |= mask >> 16;
return (mask ^ num);
}
371. 两整数之和
【题目】:
【代码】:
class Solution {
public int getSum(int a, int b) {
if(b==0){
return a; //没有进位时返回异或的结果
}
int m=a^b; //无进位的相加
int n=(a&b)<<1; //每一位的进位
return getSum(m,n);
}
}
效果: