比较二进制整数ruby

时间:2017-04-27 06:53:19

标签: ruby-on-rails ruby bitmask

我正在使用Ruby中的主位掩码,其中包含一系列设置。我已将位掩码转换为二进制,并需要将其与其他二进制值进行比较,以查看是否存在某些设置。

例如,我从位掩码开始:

bitmask = 1540104

然后使用:

转换为二进制文件
binary = bitmask.to_s(2) => 101111000000000001000

由于主二进制文件中的每个1代表一个设置,我如何迭代该结果以查看21位二进制文​​件上下文中的每个1的位置?像这样:

100000000000000000000
001000000000000000000
000100000000000000000
000010000000000000000
000001000000000000000
000000000000000001000

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:7)

  

如何迭代该结果,以便在21位二进制文​​件的上下文中查看每个1的位置?

如果您只想这些位,即出于调试目的,您可以通过Integer#bit_lengthInteger#[]和一些位移来解决它:

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 :(得分:3)

显示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

答案 2 :(得分:0)

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