我有5个不同的值,保存为10010这样的位。 我从数据库中获取了作为Int的值(不能改变它),因此24表示11000 我知道我可以通过使用
获得最大的收益if ((decbin($d) & 16) == 16)
但如果第一个是0,我将不得不检查下一个位,如果是0,我将不得不...
所以我毕竟会有一块ifs,如果有更多位,那么块更大。 是否有一种简单的方法可以获得最高位的“id”(或值,无关紧要)1?
答案 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)