2014-12-14 1 views
0

비트 1의 수가 홀수인지 짝수인지 알고 싶습니다. 여기 코드입니다 :패리티가 짝수 또는 홀수의 1의 비트를 찾기 위해 어떻게 작동합니까?

int odd_ones(unsigned x) 
{ 

    x ^= x >> 16; 
    x ^= x >> 8; 
    x ^= x >> 4; 
    x ^= x >> 2; 
    x ^= x >> 1; 
    return !(x&1); 
} 

그러나 그것이 어떻게 작동하는지 모르겠어요; 나는 오랫동안이 일에 매달 렸습니다.

+5

당신이 무엇을'>>','및 이해 하는가' '^'는 무엇입니까? 그렇지 않다면, 당신이 그것을 얻지 못하는 이유입니다. 그렇다면, 어디에 갇혀 있는지 말해주십시오. – Maroun

+0

>> 오른쪽 셔츠 용 스탠드 & ^ XOR 용 스탠드. 나는 아래에있는 모든 비트를 적어 둡니다, 그것은 진정한 답을 주지만 어떻게 줄 수 있는지 모르겠습니다. ??? –

+0

'odd_ones()'는 내가 기대하는 반대 값인'odd_ones (0)'-> 1과'odd_ones (1)'-> 0을 반환합니다.이 함수의 이름을'is_even_parity()'. – chux

답변

5

시도가 x ^= x >> 16; 하 후 x의 마지막 16 비트의 원래의 값으로서 x1의 동일 패리티를 가질 것으로 증명 (가정 X는 32 비트이다). 그런 다음 x ^= x >> 8;을 수행 한 후 비트의 비트가 1 -s의 동일한 패리티를 가지며, 의 마지막 16 비트가보다 작습니다. 일반적으로 x ^= x >> L을 수행 할 때 결과의 마지막 L 비트는 과 동일한 패리티를 가지며 1의 패리티는 마지막 2*L 비트의 원래 값 x입니다.

+0

이제 약간 이해 하겠지만 x^= x >> L을 수행 한 후 어떻게 증명할 수 있습니까? 결과의 마지막 L 비트는 마지막 2 * L에서 1의 패리티와 동일한 패리티를 갖습니다. –

+0

비트 조작에 좋은 연습입니다. 내가 너에게 답을 주면 너를 잘할 수 없을거야. –

+0

좋아요, CSAPP에서 이번에는 더 열심히 생각합니다. 덕분에 당신의 도움을 주셔서 감사합니다 –

0

다음은 8 비트 패리티 생성기의 회로도이다.
코드가이 조합 회로를 순차 논리 (32 비트 용)로 구현하려고합니다.
이 회로의 작동을 상상하면 코드를 이해하는 데 도움이됩니다.

enter image description here

8 비트 위 회로 예에 대한 해당 코드는 다음과 같습니다

int odd_ones(unsigned x) 
{ 
    x ^= x >> 1; 
    x ^= x >> 2; 
    x ^= x >> 4; 
    return !(x&1); 
} 

이미지 의례 Brigham Young University

관련 문제