문제

나는 사람들이 비트 단위로 객체를 압축하는 것에 관해 이야기하는 곳을 여기저기서 읽었습니다."처음 세 비트는 이런저런 것을 나타내고, 다음 두 비트는 이것을 나타내고 12비트는 저것을 나타냅니다."

메모리 사용량을 최소화하는 것이 왜 바람직한지 이해하지만 이를 구현하는 좋은 방법이 생각나지 않습니다.나는 그것을 하나 이상의 정수(또는 long 등)로 묶을 것이라는 것을 알고 있지만, 그것을 사용하는 쉬운 방법은 상상할 수 없습니다.임의의 길이의 이진 필드에서 임의의 비트를 가져오거나 설정할 수 있는 클래스가 있으면 꽤 멋질 것입니다. 그러면 이 클래스가 나를 위해 모든 일을 처리해 줄 것이고 &와 |'를 가지고 장난을 치지 않아도 될 것입니다. 와 마스크 등등.

이런 종류의 표준 패턴이 있습니까?

도움이 되었습니까?

해결책

에서 MSDN:

Bitarray 클래스

부울으로 표시되는 소형 비트 값 배열을 관리합니다. 여기서 True는 비트가 (1)에 있고 거짓이 비트가 OF (0)임을 나타냅니다.

예시:

BitArray myBitArray = new BitArray(5);
myBitArray[3] = true; // set bit at offset 3 to 1

그러나 BitArray를 사용하면 개별 비트 만 설정할 수 있습니다. 더 많은 비트로 값을 인코딩하고 싶다면 아마도 값과 마스크와 마스크와 물건에 대한 방법이 없을 것입니다 :-)

다른 팁

당신은 확인하고 싶을 수도 있습니다 비트벡터32 .NET Framework의 구조입니다.int 내의 비트 범위인 "섹션"을 정의한 다음 해당 섹션에 값을 읽고 쓸 수 있습니다.

주요 제한 사항은 단일 32비트 정수로 제한된다는 것입니다.이는 수행하려는 작업에 따라 문제가 될 수도 있고 그렇지 않을 수도 있습니다.dtb에서 언급했듯이 BitArray는 모든 크기의 비트 필드를 처리할 수 있지만 한 번에 단일 비트만 가져오고 설정할 수 있습니다. BitVector32와 같은 섹션은 지원되지 않습니다.

당신이 찾고있는 것은 Bitwise Operations라고합니다.

예를 들어, 우리는 정수의 최소 24 비트에서 RGB 값을 나타내겠다고 가정 해 봅시다. R은 23-16, G는 비트 15-8, B는 7-0입니다.

다른 비트에 영향을 미치지 않고 0과 255 사이의 값으로 R을 설정할 수 있습니다.

void setR(ref int RGBValue, int newR)
{
  int newRValue = newR << 16; // shift it left 16 bits so that the 8 low-bits are now in position 23-16
  RGBValue = RGBValue & 0x00FF; // AND it with 0x00FF so that the top 16 bits are set to zero
  RGBValue = RGBValue | newRValue;   // now OR it with the newR value so that the new value is set.
}

Bitwise ands 및 ORS (및 때로는 더 이국적인 작업)를 사용하면 더 큰 값의 개별 비트를 쉽게 설정하고 지울 수 있습니다.

툴킷 또는 플랫폼 특정 래퍼 클래스를 사용하는 대신 총알을 물고 당신의 모든 비트 연산자가 어떻게 작동하는지에 대해 총알을 물고 배우는 것이 좋습니다. 대체로 대부분의 프로젝트에서 수행되는 방식이며 운영은 매우 빠릅니다. 작업은 대부분의 언어에서 거의 동일하므로 일부 특정 툴킷에 의존하지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top