找到最高设置位

时间:2011-02-09 14:05:17

标签: php math bitwise-operators bit

我有5个不同的值,保存为10010这样的位。 我从数据库中获取了作为Int的值(不能改变它),因此24表示11000 我知道我可以通过使用

获得最大的收益
if ((decbin($d) & 16) == 16)

但如果第一个是0,我将不得不检查下一个位,如果是0,我将不得不...

所以我毕竟会有一块ifs,如果有更多位,那么块更大。 是否有一种简单的方法可以获得最高位的“id”(或值,无关紧要)1?

4 个答案:

答案 0 :(得分:8)

是。计算数字的基数2对数和floor它:

$highbit = floor(log($d, 2));

例如,如果$highbit为5,则表示第5位是设置为1的最高位。

答案 1 :(得分:1)

整数中设置的最高位等于该整数的整数base-2对数。

虽然在汇编程序和C语言中存在许多不同的实现,但是或多或少有效,在PHP中执行它的最简单的方法是实际使用对数。

log()函数肯定不是解决问题的最有效方法,但是当你使用脚本语言时,它可能不会比实现其中一个更慢(并且可能更快)更好的“PHP中的算法,包含2打语句。

因此:

$ highestbit =(int)(log($ value,2));

答案 2 :(得分:0)

有趣......不得不立即检查舍入问题,发现没有在高达1'000'000的范围内,尽管我的测试代码显示了较少的原生基础的问题,如3:

3 ^ 5 = 243但是floor(log(243,3))给出4

答案 3 :(得分:0)

def hibit(v):
    """ uint v -> highest bit: 0101 -> 0100, 01xxxx -> 010000 """
    # cf http://graphics.stanford.edu/~seander/bithacks.html
    v |= v >> 1
    v |= v >> 2
    v |= v >> 4
    v |= v >> 8
    v |= v >> 16
    return v ^ (v >> 1)

for v in range(0, 9+1) + range(2**31-1, 2**31+2):
    print v, hibit(v)