2012-08-10 2 views
2

비트 마스크에 따라 두 비트 필드를 병합하기 위해 비트 연산을 사용할 수 있는지 궁금합니다. 예를 들어 I는 두 값 및 비트 마스크 가지고비트 마스크에 따라 두 비트 필드를 병합

char mask = 0x29; // 0010 1001 
char a = 0x9;  // 0000 1001 original value 
char b = 0xE8; // 1110 1000 modified value 

및 I는 비트 마스크에있어서, (A)의 값 B의 비트를 설정하려는. 3 비트 만 영향을받습니다.

char val = 0xC9; // 1100 1001 value 

그럼 비트 연산만으로 어떻게 할 수 있습니까? 사전에

감사합니다.

답변

2

먼저 마스크의 세트 비트를 b에서 제거하십시오. 그런 다음 비트가이 아닌 마스크에서 a으로 설정합니다. 마지막으로, 두 개의 서로 OR 결과

b = (b & ~mask) | (a & mask); 

물결 ~ 연산자는 부정 마스크를 생성한다. ~mask으로 AND을 입력하면 마스크에 설정된 비트 b이 0으로 초기화됩니다.

+0

고맙습니다. – hcpeter

5

시도 뭔가 같은 : 또한

b &= ~mask;  /* Clear bits set in mask. */ 
b |= (mask & a); /* Add bits set both in a and in mask. */ 

, 당신은 결정적 char 대신 unsigned 유형을 사용할 수 있습니다.

2
val = a^((a^b) & mask); 

또한 작동합니다. 보통 그렇게 도움이되지는 않지만 상황이있을 수 있습니다. 예를 들어 ab이 둘 다 상수 일 경우 일반 수식보다 더 단순화 할 수 있습니다.

+0

이것은 일반적으로 분명한 방법보다 한 번의 작업이 짧습니다. https://graphics.stanford.edu/~seander/bithacks.html#MaskedMerge – DHW