2017-04-27 88 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