Guest User

Untitled

a guest
Jan 18th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. import collections
  2. import math
  3. import timeit
  4.  
  5. def power_bit_length(x):
  6. return 2**(x-1).bit_length()
  7.  
  8. def shift_bit_length(x):
  9. return 1<<(x-1).bit_length()
  10.  
  11. def power_log(x):
  12. return 2**(math.ceil(math.log(x, 2)))
  13.  
  14. def test(f):
  15. collections.deque((f(i) for i in range(1, 1000001)), maxlen=0)
  16.  
  17. def timetest(f):
  18. print('{}: {}'.format(timeit.timeit(lambda: test(f), number=10),
  19. f.__name__))
  20.  
  21. timetest(power_bit_length)
  22. timetest(shift_bit_length)
  23. timetest(power_log)
  24.  
  25. 4.38817000389: power_bit_length
  26. 3.69475698471: shift_bit_length
  27. 7.91623902321: power_log
  28.  
  29. 6.566169916652143: power_bit_length
  30. 3.098236607853323: shift_bit_length
  31. 9.982460380066186: power_log
  32.  
  33. 2.8580930233: power_bit_length
  34. 2.49524712563: shift_bit_length
  35. 3.4371240139: power_log
  36.  
  37. def next_greater_power_of_2(x):
  38. return 2**(x-1).bit_length()
  39.  
  40. In [144]: math.log(6,2)
  41. Out[144]: 2.584962500721156
  42.  
  43. In [145]: math.log(8,2)
  44. Out[145]: 3.0
  45.  
  46. In [146]: math.ceil(math.log(6,2))
  47. Out[146]: 3.0
  48.  
  49. In [147]: math.ceil(math.log(8,2))
  50. Out[147]: 3.0
  51.  
  52. In [148]: math.ceil(math.log(16,2))
  53. Out[148]: 4.0
  54.  
  55. In [149]: 2**math.ceil(math.log(6,2))
  56. Out[149]: 8.0
  57.  
  58. v+=(v==0);
  59. v--;
  60. v|=v>>1;
  61. v|=v>>2;
  62. v|=v>>4;
  63. v|=v>>8;
  64. v|=v>>16;
  65. v++;
  66.  
  67. def next_power_of_2(n):
  68. if n == 0:
  69. return 1
  70. if n & (n - 1) == 0:
  71. return n
  72. while n & (n - 1) > 0:
  73. n &= (n - 1)
  74. return n << 1
Add Comment
Please, Sign In to add comment