>백엔드 개발 >C++ >8개의 부울 값을 단일 바이트로 효율적으로 병합하고 디코딩하려면 어떻게 해야 합니까?

8개의 부울 값을 단일 바이트로 효율적으로 병합하고 디코딩하려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-12-31 22:28:10988검색

How Can I Efficiently Merge and Decode Eight Boolean Values into a Single Byte?

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

소개

프로그래머는 종종 부울 값을 단일 바이트와 같은 압축 형식입니다. 이 문서에서는 부울 값을 바이트에 병합하고 디코딩하는 두 가지 접근 방식을 살펴봅니다.

부울 값 병합

8개의 부울 값을 바이트로 병합하려면 다음을 사용할 수 있습니다. 다음 접근 방식:

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;
}

이 코드는 부울 값을 반복하여 해당 값을 설정합니다. 비트별 OR 연산을 사용하여 바이트의 비트를 계산합니다.

바이트 디코딩

바이트를 8개의 개별 부울 값으로 디코딩하려면 다음 함수를 사용할 수 있습니다.

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

이 함수는 바이트의 비트를 반복하여 각 비트가 설정되었는지 확인하고 해당 부울을 할당합니다. value.

멋진 대안: Union

또는 Union을 사용하여 부울 값과 바이트를 모두 나타낼 수 있습니다.

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;
};

By 공용체의 한 멤버에 쓰고 다른 멤버에서 읽으면 부울 값을 효율적으로 병합하고 디코딩할 수 있습니다. 그러나 Bits 구조의 비트 순서는 구현에 따라 정의된다는 점에 유의하는 것이 중요합니다.

구현 참고 사항

다른 항목에 쓴 후의 결합은 ISO C99와 주요 C 컴파일러의 확장으로 잘 정의되어 있습니다. 그러나 ISO C에서는 정의되지 않은 동작입니다. 이식성을 보장하려면 C에서 유형 판단을 위해 memcpy 또는 C 20 std::bit_cast를 사용하는 것이 좋습니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.