2012-11-15 3 views
2

논리 연산자 (||, & &) 만 사용하여 숫자가 고르지 않거나 고르지 않은지 확인하기 위해 약간 혼란 스럽습니다.논리 연산자 만 사용하여 숫자 패리티 확인

내가 사용 해요 :

if (x%2) 
    printf("Number is even"); 
else 
    printf("Number is not even"); 

숫자의 패리티를 결정하는데 사용됩니다 어떤 알고리즘이 있습니까? 있다면, 저에게 문서를 좀 줄 수 있어요? 당신을 가정

안부, Duluman 에디

+0

이 * 논리적 * OR 및 AND, 비트 NOT거야? – Mike

답변

2

먼저 전환 할 수 있습니까?당신은 단지 1 비트를 사용하는 경우, 논리 연산자와 동일한 "비트"논리를 달성 할 수 있도록 예를 들어 :

int num = 0x14; // 0000 0000 0001 0100 
unsigned short shift_num = num << 15; // 0000 0000 0000 0000 

if(shift_num && 1) 
    printf("it's odd\n"); 
else 
    printf("it's even\n"); 

그래서 아무것도 아닌 0 && 1은 우리가하지만 모든를 shiffted이 경우, 당신에게 일을 제공합니다 가장 낮은 비트, 심지어 위의 경우 0으로 놓고 0 && 1이 거짓이므로 "it's even"이 인쇄됩니다. 우리가 홀수 사용하는 경우 :

int num = 0x15; // 0000 0000 0001 0101 
unsigned short shift_num = num << 15; // 1000 0000 0000 0000 

이제 0이 아닌 숫자가 1이 거기를 우리는 "it's odd"

+0

흥미로운 해결책, +1 (비록'int'의 모든 범위에 대해 충분히 이식성이 있는지 확인하기 위해'sizeof' /'CHAR_BITS' 속임수를 사용해야합니다). –

1

의미 &|이 (논리적, 단락 대응에 있기 때문에 거기에 해결책)을 비트 운영자 :

if(x&1) 
    puts("odd"); 
else 
    puts("even"); 

(및 괜찮은 컴파일러는 x%2을 볼 때 x&1에 대한 코드를 자동으로 내 보냅니다.

&1x의 최하위 비트를 추출합니다. 이는 홀수 인 경우 1이고 짝수 인 경우 0 또는 짝수이므로 최하위 비트를 추출합니다.

+0

+1 비트 연산자를 자주 사용하는 것이 좋겠다. –

+0

OP는'||'과'&&'가 아니라'|'와'& '를 사용합니다. – Mike

+0

&는 논리 연산자가 아닙니다 – Omkant

2

정수의 경우, 연산자 x & 1을 사용하여 비트 0 값 (짝수는 0, 홀수는 1)을 테스트 할 수 있습니다.

+0

OP는'||'와'&&'를 사용하고,'|'와'&'는 사용하지 않습니다. – Mike

1

논리 ||&&는 항상true 산출 또는 false1 또는 0 의미한다.

나는 당신이 찾을 수있는 당신이 ||&&&| 나중에 사람 사이에 혼란 비트 연산자를 생각하고 비트를 사용하여 짝수와 홀수

if(n & 1) 
    printf("odd"); 
else 
    printf("even"); 
+0

당신은 그것들을 섞어 놓았습니다. (n & 1)이면 이상해야합니다. – Anon

4

그것은 단지 논리 연산자 &&||을 사용 불가능합니다. 단지 &&|| 관련된 모든 표현에

, 당신은 0x10와 (홀수) 값 0x01을 (심지어입니다) 대체 할 수있는, 그 결과는 두 값이 모두까지 논리적으로 "true"로하기 때문에 동일합니다 논리 연산자가 관련되어 있습니다. 따라서이 표현은 둘 사이를 구별하지 않습니다. 당신이 공식적으로 그것을 증명해야하는 경우

, 당신은 어떤 표현 만이 연산자를 포함한다는 사실을 이용하여 강력한 유도에 의해 그것을 할, 그리고 총 n 연산자를 포함하는 수, 형태의 표현에 반드시 동등하거나 (A) && (B) 또는 (A) || (B), 여기서 AB은 두 연산자 만 포함하고 총 연산자 수는 n 개 미만입니다. n == 1으로 기본 케이스를 증명하는 것은 간단합니다.

+0

이상한 점은 강사가 논리적 연산자 만 사용하여이 문제를 해결해 달라는 요청을 받았기 때문에 가능하다고 믿습니다. 그러나 여전히 그의 연습 문제에서 오자가 될 수 있습니다. – Eduard

+1

@edduvs : 강사가 비트 연산자를 논리 연산자라고 생각할 수도 있습니다. 하지만 그렇지 않으면 나는 네가 옳다고 생각한다. 그것은 다른 한 단어의 오타가되어야한다. –