Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import collections
- import math
- import timeit
- def power_bit_length(x):
- return 2**(x-1).bit_length()
- def shift_bit_length(x):
- return 1<<(x-1).bit_length()
- def power_log(x):
- return 2**(math.ceil(math.log(x, 2)))
- def test(f):
- collections.deque((f(i) for i in range(1, 1000001)), maxlen=0)
- def timetest(f):
- print('{}: {}'.format(timeit.timeit(lambda: test(f), number=10),
- f.__name__))
- timetest(power_bit_length)
- timetest(shift_bit_length)
- timetest(power_log)
- 4.38817000389: power_bit_length
- 3.69475698471: shift_bit_length
- 7.91623902321: power_log
- 6.566169916652143: power_bit_length
- 3.098236607853323: shift_bit_length
- 9.982460380066186: power_log
- 2.8580930233: power_bit_length
- 2.49524712563: shift_bit_length
- 3.4371240139: power_log
- def next_greater_power_of_2(x):
- return 2**(x-1).bit_length()
- In [144]: math.log(6,2)
- Out[144]: 2.584962500721156
- In [145]: math.log(8,2)
- Out[145]: 3.0
- In [146]: math.ceil(math.log(6,2))
- Out[146]: 3.0
- In [147]: math.ceil(math.log(8,2))
- Out[147]: 3.0
- In [148]: math.ceil(math.log(16,2))
- Out[148]: 4.0
- In [149]: 2**math.ceil(math.log(6,2))
- Out[149]: 8.0
- v+=(v==0);
- v--;
- v|=v>>1;
- v|=v>>2;
- v|=v>>4;
- v|=v>>8;
- v|=v>>16;
- v++;
- def next_power_of_2(n):
- if n == 0:
- return 1
- if n & (n - 1) == 0:
- return n
- while n & (n - 1) > 0:
- n &= (n - 1)
- return n << 1
Add Comment
Please, Sign In to add comment