2011-03-01 6 views
1

이 질문에서 모든 정수는 부호없는 것으로 가정합니다.C의 "동적 비트 필드"

작은 크기의 정수를 64 비트 정수로 팩할 수있는 두 가지 함수, pack 및 unpack을 작성한다고 가정 해 보겠습니다. 그러나 정수의 위치와 너비는 런타임에 주어 지므로 C 비트 필드는 사용할 수 없습니다.

가장 빠른 것은 예제로 설명하는 것입니다. 단순화하기 위해, 나는 8 비트 정수로 설명합니다 :

   * * 
bit # 8 7 6 5 4 3 2 1 
myint 0 1 1 0 0 0 1 1 

한다고 가정 나는 위치에 5에서 "압축 해제"할, 폭 2 이들의 정수는 별표 (*)로 표시된 두 개의 비트가 있습니다. 해당 작업의 결과는 0b01이어야합니다. 마찬가지로, 너비가 6 인 위치 2에서 압축을 풀면 0b100011이됩니다.

비트 쉬프트 (bithift-left)와 비트 쉬프트 (bithift right)를 사용하여 언팩 (unpack) 기능을 쉽게 작성할 수 있습니다.

그러나 필자는 이와 반대로 "팩"기능을 작성하는 명확한 방법을 생각할 수 없습니다.

위치 5에서 (위에서) 민트로 포장, 정수 0b11 주어 말하고 폭 2

   * * 
bit # 8 7 6 5 4 3 2 1 
myint 0 1 1 1 0 0 1 1 

내가 함께 OR, < 비트 문자열을 concatinating을 많이 포함 해낸 최고의 얻을 것이다 < 및 >> 구현하고 테스트하기 전에 누군가가 똑똑한 빠른 해결책을 본 것일까 요?

답변

5

내 머리 꼭대기에서 테스트하지 않았습니다. 하여 예에서

int pack(int oldPackedInteger, int bitOffset, int bitCount, int value) { 
    int mask = (1 << bitCount) -1; 
    mask <<= bitOffset; 
    oldPackedInteger &= ~mask; 
    oldPackedInteger |= value << bitOffset; 
    return oldPackedInteger; 
} 

: 0x63의 전류 값 인 경우

int value = 0x63; 
value = pack(value, 4, 2, 0x3); 

4 (해당 두 비트와 함께)의 오프셋의 값 "3"을 기입한다.

+1

예. 그리고 언팩 (undpack) 방법과 유사하게 : OP는 "비트 시프트 (bithift-left) 다음에 비트 시프트 (bithift right)"를 사용하여 압축을 풀 필요가 없습니다. '&'가 뒤 따르는 우 시프트는 그 트릭을 수행 할 것입니다. – LukeH

+0

@ 루크 : 나는 예제를 얻지 못했다. 압축을 풀면 0x0b01과 0xb100011이 어떻게됩니까? – EboMike

+0

@EboMike, 비트 5는 0, 비트 6은 1입니다. – Max