2012-03-04 5 views
2

여기에 C 프로그램에서 본 코드가 있는데,이 코드는 문자 c에 해당하는 비트 ASCII 비트 맵에 비트를 설정한다는 것을 알고있었습니다.C 언어 비트 트릭

field[ (c & 0x7f) >> 3 ] |= 1 << (c & 0x07); 

필드는 16 문자의 배열이며 각 문자는 8 비트입니다.

'97'는 코드 위에 대응하는 비트 맵을 설정 한 이유 'A', 우리는 (97) (C)을 설정하면, 그 다음 97 1.

설정한다 비트 위치 중 하나가 알 소문자 인 문자 c? 과 그 마법의 숫자 0x7f, 0x07, 3 및 1은 무엇입니까?

답변

6

배열의 길이가 16 바이트 인 경우 128 비트 (16 x 8)입니다. 따라서 첫 번째 마스크 (0x7f)는 처음 128 자에만 관심이 있음을 보장합니다. 일단 3 비트 오른쪽으로 이동하면 비트 필드를 주소 지정하는 데 사용되는 4 비트가 남아 있습니다 (숫자 ((& 0x7F) >> 3은 0에서 15 사이의 숫자 임). 그래서이 파트는 상위 4 비트를 사용하여

이제 바이트의 비트를 주소 지정해야하므로 마스크 0x07을 사용하여 값을 0-7 (비트 0-7에 해당)으로 제한합니다.이 번호를 사용합니다 1 개 많은 위치를 이동 할 수 있습니다.

을 끝에서, 당신은 비트가 0 ~ 127 (8 비트의 16 바이트)에. 내가 정리하기 위해이 도움이!

1

먼저 희망 위치에 설정 한 마법 번호

0x7f은 이진수가 0111 1111입니다. 이것은 c의 하위 7 비트가 중요 함을 의미합니다. 그런 다음 원래의 0xxx x000 (4) 비트 만 유효하도록 3으로 시프트됩니다. 그러나이 비트는 3만큼 시프트되기 때문에 0부터 15까지 계산됩니다.

0x07은 이진수로 0000 0111입니다. 이는 하위 3 비트 만 중요 함을 의미합니다. 숫자 1은이 3 비트의 값만큼 왼쪽으로 시프트되어 바이트 내의 비트 위치 0-7에 비트가 설정됩니다.

결국이 함수는 바이트의 하위 7 비트 만 사용합니다.이 비트는 ASCII 문자의 유일한 유효 비트입니다. 배열의 바이트를 주소 지정하기 위해 상위 4를 사용하고 주소 지정된 바이트의 비트를 주소 지정하기 위해 맨 아래 3을 사용합니다.