سؤال

وأنا في حاجة لتحويل مجموعة من الأعداد الصحيحة إلى قناع بت endian القليل باستخدام روبي. سيكون موضع تقدير أي وصلات أو تلميحات.

ويقول المثال [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

وهذا لا العمل، ولكن هل أنا على الطريق الصحيح؟

هل كانت مفيدة؟

المحلول

لا يمكن استخدام 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 هي 4 يقضم التي تمثل معا 2 بايت؟ هذه هي الطريقة الوحيدة التي يمكنني أن تجعل البايت الأول يكون ثاني ومجموعة الشيء السابع (القراءة endian قليلا).

و... وهذا هو أكثر من "فهم مستندات" قضية من انها قضية روبي.

وبالتالي فإن الحل مجموعة ليست واحدة التي تحتاج إليها، لأنك تحتاج إلى تعيين بت الفردية في عدد. وأفضل طريقة لتحقيق ذلك باستخدام (يسار) تحول قليلا << وor'ing | نتائج معا.

نصائح أخرى

و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     |  
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top