문제

Ruby를 사용하여 정수 배열을 작은 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 ()? 바이트 주문 옵션이 있습니다.

업데이트 : OK 귀하가 언급 한 문서를 살펴보고 예제를 수행 할 수있는 유일한 방법은 다음과 같습니다.

  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 개의 니블임을 의미 할 것입니다. 그것이 제가 첫 번째 바이트가 두 번째와 일곱 번째 비트 세트를 가질 수있는 유일한 방법입니다 (Little 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