Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1. # それぞれのフィールドのビット幅を指定した配列にしたがって整数を分解する関数。
  2. # unpack_bits(0b11000001, [2, 6]) = [3, 1] = [0b11, 0b000001]
  3.  
  4. # 平易で好き
  5. def unpack_bits(integer, sizes)
  6. res = []
  7. sizes.reverse_each do |size|
  8. res.unshift(integer & (2**size - 1))
  9. integer >>= size
  10. end
  11. return res
  12. end
  13.  
  14. # 短くなったけどちょっとわかりにくい?
  15. def unpack_bits(integer, sizes)
  16. sizes.reverse_each.with_object([]) do |size, acc|
  17. acc.unshift(integer & (2**size - 1))
  18. integer >>= size
  19. end
  20. end
  21.  
  22. # tap したいお年頃
  23. def unpack_bits(integer, sizes)
  24. [].tap do |acc|
  25. sizes.reverse_each do |size|
  26. acc.unshift(integer & (2**size - 1))
  27. integer >>= size
  28. end
  29. end
  30. end
  31.  
  32. # 素朴な再帰
  33. def unpack_bits(integer, sizes)
  34. if sizes.empty?
  35. []
  36. else
  37. size = sizes.last
  38. unpack_bits(integer >> size, sizes[0..-2]) + [integer & (2**size - 1)]
  39. end
  40. end
  41.  
  42. # reduce したいお年頃
  43. def unpack_bits(integer, sizes)
  44. sizes.reverse.reduce([[], integer]) { |(res, i), size|
  45. [[i & (2**size - 1)] + res, i >> size]
  46. }.first
  47. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement