3

Rubyを使用して、整数の配列をリトルエンディアンのビットマスクに変換する必要があります。リンクやヒントをいただければ幸いです。

例では、[2,7,9,11] => "4205"

a = [2,7,9,11] # 4205
b = [1,2,3,4] # 0F00
def array_to_mask(arr)
  mask = 0
  arr.each do |i|
    mask = mask | (1 << i)
  end
  return mask.to_s(16)
end
p array_to_mask(a) # a84
p array_to_mask(b) # 1e

これは機能しませんが、私は正しい方向に進んでいますか?

4

2 に答える 2

2

arr.pack()を使用できませんか? バイトオーダーのオプションがあります。

更新:わかりました、あなたが言及したドキュメントを確認しました。この例を機能させる唯一の方法は次のとおりです。

  7          2              11   9      (decimal index count)
0 1 0 0  0 0 1 0  0 0 0 0  0 1 0 1      (bits)

   4        2        0        5         (nibbles, in hex)

しかし、それは 4205 が 2 バイトを表す 4 つのニブルであることを意味しますか? これが、最初のバイトに 2 番目と 7 番目のビットを設定する唯一の方法です (リトル エンディアンを読み取る)。

...これは、ルビーの問題というよりも、「ドキュメントを理解する」問題です。

したがって、個々のビットを数値で設定する必要があるため、配列ソリューションは必要なものではありません。これは、(左) ビット シフト << および or'ing | を使用して最もよく達成されます。結果を一緒に。

于 2010-01-12T20:57:58.913 に答える
0

Enfora から電卓が送られてきて、関数を書くために調べました。この説明が、次にこれを試す人に役立つことを願っています。

values: [2,7,9,11]
Bits:   | 8 7 6 5 | 4 3 2 1 | 16 15 14 13 | 12 11 10 9 |
Binary: | 0 1 0 0 | 0 0 1 0 | 0  0  0  0  | 0  1  0  1 |
Hex:    |    4    |    2    |      0      |      5     |  
于 2010-01-15T13:11:20.053 に答える