2013-04-12 2 views
3

나는 비교적 좋은 C 프로그래머이다. 나는 연구하고 질문하는 것을 좋아하지만이 특정 코드는 간단하게 문제가된다. 그것은 XQueryKeymap 사용되었다,하지만 난 전혀 이해가 안 : 정말 날 괴롭히는 무엇이 기능은 매크로 의미와 어떤 차이가 있습니까?

#define BIT(c,x) (c[x/8]&(1<<(x%8))) 

[]<< 상징이다. 하지만 당신이 구두로 전체의 의미를 말할 수 있다면, 나는 정말로 감사 할 것입니다.

+2

내가 이것을 편집하고 '8'을 ['CHAR_BIT'] (http://en.cppreference.com/w/c/types/limits)로 바꾸라고 충고하는 유일한 사람은 누구입니까? – WhozCraig

+0

나 자신을 괄호 내고 싶다. 그 매크로는 냄새가 난다. –

+0

나는 너희들에게 동의하지 않는다. 그러나 진실은 대부분의 코드가 엉성하고 문서화되어 있지 않다는 것이지만, 적어도 그것이 일을 끝내고 나는 많은 사람들이 새로운 것을 배웠다는 것이다. – FutureSci

답변

5

값을 문자 배열로 비트 패킹합니다. 배열 요소 (문자 배열) 당 8 비트가 있으므로 배열의 인덱스는 x/8에 의해 정의됩니다. 반면에 1<<(x%8)은 계수의 8 비트에 대해 단일 비트를 이동합니다 (나머지는 x/8의 나머지). -이 매크로는 비트 x이 설정되면 0이 아닌 값을 반환하고 그렇지 않으면 0을 반환합니다.

3

Ewww. c이 derefencable 유형이 아니며 x이 정수 유형이 아닌 경우이 매크로는 실패합니다. 또한 괄호가 없어 안전성이 떨어집니다. 좋지 않은 코드.

x을 비트 수로 변환하면 짧은 코드가 c에 포함 된 메모리 배열로 변환됩니다. <<은 비트를 읽기 위해 마스크를 위로 이동시키고 []은 메모리를 읽는 것입니다. 배열 내의 비트가 설정되면 1을, 그렇지 않으면 0을 반환합니다. 따라서 BIT 이름입니다.

관련 문제