幂函数的位运算解法

以我们常用的2的幂、3的幂、4的幂解法作为例子

1. 2的幂解法

问题: 判断一个数是否是2的幂

解法一: 常规解法
bool isPowerOfTwo(int n) {
	if (n <= 0) return false;
	int ans = 0;
	while (n != 0) {
	    if (n&1) ans++;
	    n >>= 1;
	}
	if (ans > 1) return false;
	return true;
}

优化:
bool isPowerOfTwo(int n) {
	if (n <= 0) return false;
	while (n&1 == 0) {//也可以换成n%2 == 0
	    n >>= 1;
	}
	return n== 1;
}

解法二:利用数的二进制解法 (一般都是用在2的幂)

如果n为2的幂,那么n一定是10000000 之类的 而n-1 就是 01111111 那么n&(n-1) == 0 一定成立 否者n就不是2的幂

bool isPowerOfTwo(int n) {
	if (n <= 0) return false;
	return n&(n-1) == 0; 
	//如果n为2的幂,那么n一定是10000000 之类的 而n-1 就是 01111111  那么n&(n-1) == 0 
	//一定成立  否者n就不是2的幂
}
解法三:对数函数解法

如果n是2的幂 那么 log2(n) == (int)log2(n) [或者使用 是绝对值之差小于1e-6] 或者是 2^( log2(n) ) == n 也是一样的
hint:注意精度

1. 3的幂解法

解法一: 常规解法 (省略)
解法二:利用数的二进制解法 (3就不好用二进制解法了)

特殊解法:

3的幂次的质因子只有3,而所给出的n如果也是3的幂次,故而题目中所给整数范围内最大的3的幂次的因子只能是3的幂次,1162261467 (int范围内3的幂最大得数)是3的19次幂,是整数范围内最大的3的幂次

public boolean isPowerOfThree(int n) {
  return n > 0 && 1162261467%n == 0;
}
解法三:对数函数解法
//python写法
public boolean isPowerOfThree(int n) {
	return n>0 and 3**round(math.log(n,3))==n
}

1. 4的幂解法

解法一: 常规解法 (省略)
解法二:利用数的二进制解法

是4的幂就也一定是2的幂 所以 n&(n-1) == 0 {前提} 【最高位是1其他位置全是0】
如果是4的幂那个1一定是在二进制的奇位上 0x55555555 就是int32位中奇位上全为1的值 n&0x55555555 != 0 那么n就是4的幂

public boolean isPowerOfFour(int n) {
	if (n <= 0 || n&(n-1) ) return false;
	return n&0x55555555;
}
解法三:对数函数解法
//python写法
public boolean isPowerOfThree(int n) {
	return n>0 and 4**round(math.log(n,4))==n
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值