我知道如果数字是2的幂,那么它必须满足(x&(x-1))=0;
例如让我们采用x=16 or 10000
x-16=10000-1=01111
和(x&(x-1))= 0;对于另一个非幂数7,例如,7=0111
,7-1=0110
7&(7-1)=0110
不等于0,我的问题如何确定数字是否是另一个数k的某个幂?例如625是5 ^ 4,我怎么能找到哪个幂等于k到n?我对使用按位运算符很感兴趣,确定我可以通过强力方法找到它(通过标准算法,非常感谢
答案 0 :(得分:4)
我怀疑你是否会找到一个按位算法来确定一个数是5的幂。
通常,在y = n^x
的情况下,要查找x
,您需要使用对数,即x = log_n(y)
。大多数语言都不提供log_n
函数,但您可以使用以下标识来实现它:
log_n(y) = log(y) / log(n)
如果y
是n
的整数幂,那么x
将是一个整数。当然,由于有限精度计算机算法的局限性,你不一定能得到上述方法的确切答案。
答案 1 :(得分:2)
我害怕,你不能用简单的魔法来做到这一点。比特通常适用于2的幂。对于5的幂,你可能需要在base-5系统中运行,其中1 5 = 1 10 , 10 5 = 5 10 ,100 5 = 25 10 ,1000 5 = 125 10 ,10000 5 = 625 10 等。在base-5系统中,你可以识别5的幂,就像2的幂一样容易在二进制。但是你首先需要将你的数字转换成那个基数。
答案 2 :(得分:1)
对于任意k
,只有通用解决方案:
bool is_pow(unsigned long x, unsigned int base) {
assert(base >= 2);
if (x == 0) {
return false;
}
unsigned long t = x;
while (t % base == 0) {
t /= base;
}
return t == 1;
}
当k
是2的幂时,您可以通过检查x
是否为2的幂以及x
的尾随零位数是否可被整除来加快速度log2(k)
。
如果计算速度很重要且k
已修复,您可以随时使用这些简单的实现:
bool is_pow5(unsigned long x) {
if (x == 5 || x == 25 || x == 125 || x == 625)
return true;
if (x < 3125)
return false;
// you got the idea
...
}