求数的幂
determine power of number
我知道如果number是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,我的问题是我如何确定number是否是另一个数k的幂?比如625是5的4次方,我怎么找到k等于n的哪个幂?我对使用位运算符很感兴趣,当然我可以通过蛮力方法找到它(通过标准算法,非常感谢
我怀疑你会找到一个位算法来确定一个数是5的幂。
一般来说,给定y = n^x
,要找到x
,您需要使用对数,即x = log_n(y)
。大多数语言不提供log_n
函数,但您可以使用以下标识实现它:
log_n(y) = log(y) / log(n)
如果y
是n
的整数幂,则x
也是整数。当然,由于有限精度计算机算法的限制,使用上述方法不一定能得到确切的答案。
恐怕仅靠一点点魔法是做不到的。比特通常适用于2的幂。例如,对于5的幂,你可能需要在基数为5的系统中操作,其中15=110, 105=510, 1005=2510, 10005=12510, 100005=62510,等等。在以5为基数的系统中,你可以很容易地识别5的幂,就像在二进制中识别2的幂一样。但是你首先需要把你的数字转换成这个基数。
对于任意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
...
}
相关文章:
- 没有找到相关文章