2017-04-27 66 views
2

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

例如,我开始与位掩码:

bitmask = 1540104 

然后转换为使用为二进制:

binary = bitmask.to_s(2) => 101111000000000001000 

由于在该主二进制每个1表示一个单一的设置,我怎样可以遍历这导致看到每个1的位置在21位二进制的上下文中?像这样:

100000000000000000000 
001000000000000000000 
000100000000000000000 
000010000000000000000 
000001000000000000000 
000000000000000001000 

任何帮助将不胜感激!

+0

我不会理会它,只要使用哈希代替IMO。 <1kB的大小改进不值得代码复杂化和IMO的麻烦。 –

+0

21位可让您拥有2^21(2097152)不同的设置配置。你的应用中真的有这么多设置吗?无论如何,如果你必须这样做,你可以将它们与数字结合起来。如果一个位掩码有一个特定的设置位,它将返回1,否则它将为0. EG:'“100000000000000000000”.to_i(2)&bitmask#=> 1' while':010000000000000000000.to_i(2) &bitmask#=> 0'。 – Surya

+1

我不确定你在问什么。你想检查一个特定的位是否被设置,或者你想要一些调试输出? – Stefan

回答

7

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

如果你只是想看到位,即用于调试的目的,你可以通过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 
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 
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