浅谈:运用幂的性质
一般来说,在对数字做因式分解时,分解到质数便不可再分,而质数的幂等于多个质数相乘,所以质数的幂只有质数这一个质因子。
应用:326. 3的幂
那么我们顺便来看一下 4 的幂这一题,先列举几个 4 的幂看一下规律:
1 0000001
4 0000100
16 0010000
64 1000000
可以看出:4 的幂的二进制表示为 1 后面接偶数个 0,即:4 的幂在计算机中的二进制表示只有一个 1,且数字 1在奇数位置上。
怎么表示这一种关系呢?我们可以在 2 的幂基础上考虑,首先4的幂肯定也必须满足 2 的幂条件,即:n and n - 1 == 0
,除此之外,我们需要筛选出 2 的幂中,1 在奇数位置上的数字。
考虑一下:二进制中,0010
和0100
有什么区别?
由于0100
的奇数位置有 1,0010
的奇数位置没有 1。如果有一个数字的奇数位为 1,如0100
,将它与0010
和0100
做与运算
,奇数位置没有 1 的0010
将变成 0,奇数位置有 1 的0100
不变。这个区别就可以作为切入点。
我们用一个奇数位全为 1 的数字,01010101010101010101010101010101
,与 2 的幂做与运算。结果不等于 0 的就是奇数位置有 1 的数字。用 16进制表示01010101010101010101010101010101
,即 0x55555555,所以我们有如下代码:
fun isPowerOfFour(n: Int): Boolean {return n > 0 && n and n - 1 == 0 && (n and 0x55555555 != 0)
}
当然,我们也可以用偶数位全为 1 的数字,10101010101010101010101010101010
,与 2 的幂做与运算,结果等于 0 的就是奇数位置有 1 的数字,用 16 进制表示10101010101010101010101010101010
,即 0xAAAAAAAA,代码如下:
fun isPowerOfFour(n: Int): Boolean {return n > 0 && n and n - 1 == 0 && (n and 0xAAAAAAAA.toInt() == 0)
}