Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # それぞれのフィールドのビット幅を指定した配列にしたがって整数を分解する関数。
- # unpack_bits(0b11000001, [2, 6]) = [3, 1] = [0b11, 0b000001]
- # 平易で好き
- def unpack_bits(integer, sizes)
- res = []
- sizes.reverse_each do |size|
- res.unshift(integer & (2**size - 1))
- integer >>= size
- end
- return res
- end
- # 短くなったけどちょっとわかりにくい?
- def unpack_bits(integer, sizes)
- sizes.reverse_each.with_object([]) do |size, acc|
- acc.unshift(integer & (2**size - 1))
- integer >>= size
- end
- end
- # tap したいお年頃
- def unpack_bits(integer, sizes)
- [].tap do |acc|
- sizes.reverse_each do |size|
- acc.unshift(integer & (2**size - 1))
- integer >>= size
- end
- end
- end
- # 素朴な再帰
- def unpack_bits(integer, sizes)
- if sizes.empty?
- []
- else
- size = sizes.last
- unpack_bits(integer >> size, sizes[0..-2]) + [integer & (2**size - 1)]
- end
- end
- # reduce したいお年頃
- def unpack_bits(integer, sizes)
- sizes.reverse.reduce([[], integer]) { |(res, i), size|
- [[i & (2**size - 1)] + res, i >> size]
- }.first
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement