2012-03-28 2 views
2

저는 Kernighan과 Ritchie의 "The C Programming Language"를 읽었습니다.비트 연산자를 포함하는 C 문을 설명하는 도구

운동 2-6 함수 setbits (X, P, N, y)를 쓰기 반환 :

나는 2.9 비트 연산자 특히

에게 섹션을 통해 얻을 매우 열심히 그것을 발견하고 x의 위치는 y의 가장 오른쪽 n 비트로 설정된 위치 p에서 시작하는 비트로 나머지 비트는 변경되지 않습니다.

리처드 히스 필드라는 영리한 녀석의 운동 here에 대한 답변을있다.

리차드의 대답은 :

return (x & ((~0 << (p + 1)) 
      | (~(~0 << (p + 1 - n))))) 
    | ((y & ~(~0 << n)) << (p + 1 - n)); 

질문

사람은 위와 같은 코드의 라인을 설명하는 도구를 알고 있나요?

나는 다양한 온라인 정규식 설명 자와 유사하지만 비트 연산이 존재하기를 바라고 있습니다.

+0

도구? ;) – Shahbaz

+8

연필과 종이? –

+1

비트 단위 연산자 표현식을 구문 분석하고 설명해주는 도구가 있다고 생각하지 않습니다. 코드의 의미를 이해하려면 각 연산자를 읽어야합니다. 다음 링크 http://www.cprogramming.com/tutorial/bitwise_operators.html을 확인하고 한 번에 여러 섹션을 살펴보고 평이한 영어 (또는 선택 언어)로 설명해보십시오. –

답변

2

이 사람이 읽을 수있게 만들지 않겠습니까?

X, Y, PN

TEMP1하자 입력 될 TEMP2, TEMP3 및 0
같아야결과하자
임시 1을 0 12,385,P
플러스 1
TEMP1TEMP1가 비트 단위로 AND XTEMP1

의 동일하게
TEMP1 왼쪽으로 시프트 0의 1의 보수와 동일 할 수 있도록 하자 temp2p와 같습니다. 더하기 n
TEMP2 0의 1의 보수 같을 수는 TEMP2TEMP2

의 1의 보수와 동일하게

TEMP2 왼쪽으로 시프트는 TEMP1는 비트 단위로 OR의 동일하자 TEMP1TEMP2

TEMP3
P 는 플러스 마이너스 1 N 012,389,083 동일 할 수 있도록

TEMP2N
왼쪽으로 시프트 0의 1의 보수와 동일 할 수 있도록 TEMP2TEMP2
의 1의 보수와 동일 할 수 있도록 TEMP2의 비트와 동일 할 수 있도록 AND
TEMP2

TEMP2는 동일 할 수 있도록 Y의 나의 뇌 :TEMP2이 TEMP3
왼쪽으로 시프트는 결과는 비트 단위로 OR TEMP1TEMP2

자료 동일 수 있습니다.이 C 코드에서

합니다 (OP에서 확대) : 스택 오버 플로우의 사람들처럼

int setbits(int x, int p, int n, int y) 
{ 
    int result = 0; 

    // evaluate the expression 
    { 
     int temp1 = 0; 
     int temp2 = 0; 
     int temp3 = 0; 

     temp1 = p + 1; 
     temp1 = ~0 << temp1; 
     temp1 = x & temp1; 

     temp2 = p + 1 - n; 
     temp2 = ~0 << temp2; 
     temp2 = ~temp2; 

     temp1 = temp1 | temp2; 

     temp3 = p + 1 - n; 

     temp2 = ~0 << n; 
     temp2 = ~temp2; 
     temp2 = y & temp2; 

     temp2 = temp2 << temp3; 
     result = temp1 | temp2; 
    } 

    assert(result == ((x & ((~0 << (p + 1))| (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n)))); 

    return result; 
} 
+0

여기에는 아무 것도 설명되어 있지 않습니다. 아니면 그 점입니까? –

+0

@OliCharlesworth 그는 단지 설명이 필요하다고 물었고, 코드가 무엇을하는지 이미 알고있었습니다. 이것은 그가 어떻게 작동 하는지를 이해하는 데 도움이됩니다. –

+1

이것은 각 작동이 어떻게 작동 하는지를 설명하고 작동 방법은 설명하지 않습니다. –

관련 문제