2010-01-12 5 views
3

루비를 사용하여 정수 배열을 리틀 엔디안 비트 마스크로 변환해야합니다. 모든 링크 또는 힌트를 주시면 감사하겠습니다.리틀 엔디안 비트 마스크

의 예는 말한다 [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 

이 작동하지 않습니다,하지만 난 바른 길에 무엇입니까?

+1

레일스가 당신에게 도움이되지 않으므로 루비에 관한 질문을 편집했습니다. –

+0

어쩌면 주석에 원하는 결과가있는 예제 코드를 약간 추가 할 수 있습니다. 귀하의 질문을 이해할 수 있을지 확실하지 않습니다. –

+0

배열의 정수 집합에 대해 바이트 순서를 바꿔야한다고 생각합니다. 이는 GARMIN-엔포의 API 문서에서 제공 –

답변

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이라는 것을 의미 할 것입니다 의미 4 함께 2 바이트를 나타내는 니블? 그것은 첫 번째 바이트에 두 번째 및 세 번째 비트 세트 (리틀 엔디안 읽기)를 만들 수있는 유일한 방법입니다.

... 이것은 루비 문제보다 '문서를 이해하는'문제에 더 가깝습니다.

번호에 개별 비트를 설정해야하므로 배열 솔루션이 필요하지 않습니다. 이것은 (왼쪽) 비트 시프트 < < 및 or'ing | 함께 결과.

+0

아마 그렇게 할 수있을 것 같지 않았다. 지시문을 테스트하여 현재 필요한 항목을 확인합니다. –

+0

함수에서이 작업을 수행 할 수 있습니까? –

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  | 
관련 문제