巧妙地在Python中返回最近的“floor”二进制数?

时间:2014-03-02 17:58:23

标签: python numpy binary

寻找以下内容:

t = 1
get_floor_bin(t)
#1

t = 2
get_floor_bin(t)
#2

t = 3
get_floor_bin(t)
#2

t = 7
get_floor_bin(t)
#4

t = 15
get_floor_bin(t)
#8

t = 16
get_floor_bin(t)
#16

我目前的方法是创建一个二进制数列表,并在列表中搜索每个最近的楼层号,但我想知道是否有更聪明的方法。

谢谢!

3 个答案:

答案 0 :(得分:18)

这是你需要的吗?你的解释并不容易理解。

for i in 1, 2, 3, 7, 15, 16:
    print 1 << (i.bit_length() - 1)

这给出了:

1
2
2
4
8
16

答案 1 :(得分:2)

表达式1 << int(math.floor(math.log(x,2)))将为您提供正确的结果:

import math
for x in (1,2,3,7,15,16):
    print x, 1 << int(math.floor(math.log(x,2)))
1 1
2 2
3 2
7 4
15 8
16 16

答案 2 :(得分:0)

不确定这种方式是否足够快:

In [394]: def largestPower(n):
     ...:     return int('1'+'0'*(len(bin(n))-3), 2)

In [395]: largestPower(15)
Out[395]: 8

In [396]: largestPower(1)
Out[396]: 1

In [397]: largestPower(7)
Out[397]: 4