Ruby on rails 比较二进制整数

Ruby on rails 比较二进制整数,ruby-on-rails,ruby,bitmask,Ruby On Rails,Ruby,Bitmask,我正在使用Ruby中的主位掩码,它包含一个设置列表。我已将位掩码转换为二进制,需要将其与其他二进制值进行比较,以查看是否存在某些设置 例如,我从位掩码开始: bitmask = 1540104 然后使用以下命令将其转换为二进制: binary = bitmask.to_s(2) => 101111000000000001000 由于主二进制文件中的每个1都代表一个设置,我如何迭代该结果以查看每个1在21位二进制文件上下文中的位置?像这样: 100000000000000000000 0

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

例如,我从位掩码开始:

bitmask = 1540104
然后使用以下命令将其转换为二进制:

binary = bitmask.to_s(2) => 101111000000000001000
由于主二进制文件中的每个1都代表一个设置,我如何迭代该结果以查看每个1在21位二进制文件上下文中的位置?像这样:

100000000000000000000
001000000000000000000
000100000000000000000
000010000000000000000
000001000000000000000
000000000000000001000
任何帮助都将不胜感激

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

如果您只想查看位,即出于调试目的,您可以通过,和一些位移位来解决它:

bitmask = 1540104

bitmask.bit_length.downto(0) do |n|
  printf("%.*b\n", bitmask.bit_length, 1 << n) unless bitmask[n].zero?
end

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

我不想为它费心,只需使用哈希就可以了。21位的大小改进使您可以有2^21(2097152)个不同的设置配置。你的应用程序中真的有那么多设置吗?无论如何,如果你必须这样做,你可以把这些数字加起来。如果位掩码中有特定的设置位,它将返回1,否则将返回0。例如:
“1000000000000000000”。to_i(2)和位掩码=>1
而:
“01000000000000000”。to_i(2)和位掩码=>0
。我不确定你要的是什么。你想检查是否设置了特定位,还是想进行一些调试输出?@ericalli我强烈感觉到你在问一个关于解决实际问题的中间步骤的问题。然而,这一步可能不是必需的。
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