比较二进制整数 ruby
Compare binary integers ruby
我正在 Ruby 中使用包含设置列表的主位掩码。我已将位掩码转换为二进制,需要将其与其他二进制值进行比较以查看是否存在某些设置。
例如,我从位掩码开始:
bitmask = 1540104
然后使用以下方法转换为二进制:
binary = bitmask.to_s(2) => 101111000000000001000
由于主二进制文件中的每个 1 都代表一个设置,我如何迭代该结果以查看每个 1 在 21 位二进制文件的上下文中的位置?像这样:
100000000000000000000
001000000000000000000
000100000000000000000
000010000000000000000
000001000000000000000
000000000000000001000
如有任何帮助,我们将不胜感激!
how can I iterate over that result to see each 1's placement in the context of the 21 digit binary?
如果你只想查看位,即为了调试目的,你可以通过Integer#bit_length
, Integer#[]
和一些位移来解决它:
bitmask = 1540104
bitmask.bit_length.downto(0) do |n|
printf("%.*b\n", bitmask.bit_length, 1 << n) unless bitmask[n].zero?
end
输出:
100000000000000000000
001000000000000000000
000100000000000000000
000010000000000000000
000001000000000000000
000000000000000001000
显示 1
位置的最简单方法是简单地显示它们的位位置。
bitmask = 1540104
puts bitmask.bit_length.times.map { |i| [i, bitmask[i]] }.
select { |_, b| b == 1 }.
map { |i,_| "%2d" % i }
3
15
16
17
18
20
bitmask = 1540104
bitmask.to_s(2).each_char.with_index(0) {|b, index| puts (1 << index).to_s(2).rjust(bitmask.bit_length, "0").reverse if b == "1"}
输出:
100000000000000000000
001000000000000000000
000100000000000000000
000010000000000000000
000001000000000000000
000000000000000001000
我正在 Ruby 中使用包含设置列表的主位掩码。我已将位掩码转换为二进制,需要将其与其他二进制值进行比较以查看是否存在某些设置。
例如,我从位掩码开始:
bitmask = 1540104
然后使用以下方法转换为二进制:
binary = bitmask.to_s(2) => 101111000000000001000
由于主二进制文件中的每个 1 都代表一个设置,我如何迭代该结果以查看每个 1 在 21 位二进制文件的上下文中的位置?像这样:
100000000000000000000
001000000000000000000
000100000000000000000
000010000000000000000
000001000000000000000
000000000000000001000
如有任何帮助,我们将不胜感激!
how can I iterate over that result to see each 1's placement in the context of the 21 digit binary?
如果你只想查看位,即为了调试目的,你可以通过Integer#bit_length
, Integer#[]
和一些位移来解决它:
bitmask = 1540104
bitmask.bit_length.downto(0) do |n|
printf("%.*b\n", bitmask.bit_length, 1 << n) unless bitmask[n].zero?
end
输出:
100000000000000000000
001000000000000000000
000100000000000000000
000010000000000000000
000001000000000000000
000000000000000001000
显示 1
位置的最简单方法是简单地显示它们的位位置。
bitmask = 1540104
puts bitmask.bit_length.times.map { |i| [i, bitmask[i]] }.
select { |_, b| b == 1 }.
map { |i,_| "%2d" % i }
3
15
16
17
18
20
bitmask = 1540104
bitmask.to_s(2).each_char.with_index(0) {|b, index| puts (1 << index).to_s(2).rjust(bitmask.bit_length, "0").reverse if b == "1"}
输出:
100000000000000000000
001000000000000000000
000100000000000000000
000010000000000000000
000001000000000000000
000000000000000001000