소개
프로그래머는 종종 부울 값을 단일 바이트와 같은 압축 형식입니다. 이 문서에서는 부울 값을 바이트에 병합하고 디코딩하는 두 가지 접근 방식을 살펴봅니다.
부울 값 병합
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!