> 백엔드 개발 > C++ > 8개의 부울 값과 단일 바이트 사이를 효율적으로 변환하려면 어떻게 해야 합니까?

8개의 부울 값과 단일 바이트 사이를 효율적으로 변환하려면 어떻게 해야 합니까?

DDD
풀어 주다: 2024-12-18 11:59:11
원래의
601명이 탐색했습니다.

How Can I Efficiently Convert Between Eight Boolean Values and a Single Byte?

바이트를 부울 값으로 병합 및 디코딩

일부 프로그래밍 시나리오에서는 비트 수준에서 이진 데이터를 조작해야 합니다. 그러한 작업 중 하나는 8개의 부울 값을 단일 바이트로 또는 그 반대로 변환하는 것입니다. 이 문서에서는 이 변환을 수행하는 효율적인 방법을 살펴봅니다.

부울 값을 바이트로 변환

부울 값을 바이트로 병합하는 가장 간단한 방법은 비트 연산을 사용하는 것입니다. 각 부울 값은 바이트의 비트 위치에 해당하며 'true'는 '1'에 할당되고 'false'는 '0'에 할당됩니다. 부울 값을 기준으로 '1'을 반복적으로 왼쪽으로 이동하고 이를 누적 결과와 OR로 연결하면 바이트가 구성될 수 있습니다. 이 프로세스는 다음 함수에 예시되어 있습니다.

unsigned char ToByte(bool b[8])
{
    unsigned char c = 0;
    for (int i=0; i < 8; ++i)
        if (b[i])
            c |= 1 << i;
    return c;
}
로그인 후 복사

바이트를 부울 값으로 디코딩

반대로, 바이트를 개별 부울 값으로 디코딩하려면 유사한 반복 프로세스가 필요합니다. 바이트를 오른쪽으로 이동하고 이를 '1' 마스크와 비교함으로써 각 비트 위치를 추출하고 '1'에 대해 'true', '0'에 대해 'false'라는 부울 값을 할당할 수 있습니다. 다음 함수는 이 프로세스를 구현합니다.

void FromByte(unsigned char c, bool b[8])
{
    for (int i=0; i < 8; ++i)
        b[i] = (c & (1<<i)) != 0;
}
로그인 후 복사

비트필드 접근 방식

대체적이고 잠재적으로 더 우아한 접근 방식은 비트 필드와 공용체를 활용합니다. 8개의 1비트 필드로 구조를 정의하면 각 부울 값을 해당 필드에 직접 할당할 수 있습니다. 이 구조를 unsigned char과 결합하면 두 데이터 유형 간에 손쉽게 변환할 수 있습니다. 이는 다음 코드 조각을 통해 달성됩니다.

struct Bits
{
    unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};

union CBits
{
    Bits bits;
    unsigned char byte;
};
로그인 후 복사

Union의 두 멤버 중 하나에 값을 할당하면 변환이 자동으로 수행됩니다. 그러나 비트필드 순서와 잠재적 패딩은 구현에 따라 달라질 수 있다는 점에 유의하는 것이 중요합니다.

위 내용은 8개의 부울 값과 단일 바이트 사이를 효율적으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿