일부 프로그래밍 시나리오에서는 비트 수준에서 이진 데이터를 조작해야 합니다. 그러한 작업 중 하나는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!