public boolean isTwoPow(int n){
return n & (n-1) == 0;
}
一开始想的是用循环,发现有更简便的方法。
原理:n若是2的整数次幂,其2进制只有一位是1,其余是0。
n-1是n从右往左数第一个1变为0,此0右边低位全部变为一;
若n是2的次幂,n-1的2进制各个位和n正好相反,相与则为0;
若n不是2的次幂,则至少有两位为1,n与n-1的2进制从右往左第一位不为0的位开始往右,各个位相反,但左边至少有1位相同,两数相与结果不为0;
public boolean isTwoPow(int n){
return n & (n-1) == 0;
}
一开始想的是用循环,发现有更简便的方法。
原理:n若是2的整数次幂,其2进制只有一位是1,其余是0。
n-1是n从右往左数第一个1变为0,此0右边低位全部变为一;
若n是2的次幂,n-1的2进制各个位和n正好相反,相与则为0;
若n不是2的次幂,则至少有两位为1,n与n-1的2进制从右往左第一位不为0的位开始往右,各个位相反,但左边至少有1位相同,两数相与结果不为0;