2017-02-18 15 views
5

위에서 언급 한 질문은 다음과 같습니다. 두 정수 x1과 x2가 x1과 x2가 다른 다른 정수 x3을 찾음 x2를 사용하여 if 키워드를 사용하지 마십시오.두 개의 정수가 주어진 경우 두 번째 정수와 다른 경우 세 번째 정수를 찾으십시오.

내 솔루션은 정수에 대한 비트 단위 연산과 두 비트가 같지 않은 경우에만 두 비트 간의 XOR이 1을 반환한다는 것을 기반으로합니다.

이 해결책이 유효합니까? 더 나은 솔루션을 찾을 수 있습니까? 물론 런타임에 고려해야 할 사항과 메모리 사용량은 가능한 한 좋아야합니다.

참고 : 삼항 운영 및 비교 (.! 즉 - =, ==)뿐만 아니라 사전에

감사합니다,

가이 허용되지 않습니다.

내 솔루션 : 그들은 더 if 키워드가 다음 ternaries는 공정한 게임 없어야 말했다 이후

int foo(int x1,int x2) 
{ 
    // xor 
    int x3 = x1^x2; 

    // another xor 
    x3 = x3^x2; 

    // not 
    x3 = ~x3; 

    return x3; 

} 
+1

이 무엇 '~ (x^y^y)'는 단지'~ x'이므로,'y = ~ x' 인 경우에는 작동하지 않습니다. – Ryan

+2

'z = x^y; z = z^y'는'z = x'를 의미하고'z == ~ x'는'~ x == y'가 될 수 있습니다 ??? –

+1

'c == 1'이면 x를, 'c == 0'이면 y를 곱하면 'a = c * x + (1-c) * y'라는 곱셈 속성을 사용하여 위장 된'if'를 할 수 있습니다. 어떤 식 으로든 그것을 사용하고있을 수 있습니까? –

답변

4

대답에 내 의견을 변환 : 당신은 무엇

y = ~x 경우 작동하지 않도록, 단지 ~x~(x^y^y)이다. 하나의 옵션은 대신 사람의 위치에 X2에서의 보수 위치에 1 개는 다른과 다르다 수 있도록하는 것입니다 : (.! 단순화 (~x1 & 2) | (~x2 & 1) 신용에서 감사 @chux에)

return ~(x1 & 2 | x2 & 1); 

당신이

+3

이것은 3,4, ... integer_width 정수로 쉽게 확장 할 수 있다는 것이 깔끔한 것입니다. (비 2의 부호 비트가 아닐 수도 있습니다). – chux

3

은 물론

return (x1+1 == x2) ? x1+2 : x1+1; 

..., 현학적 인, 어쩌면 그 바람을 피우고. 문제 없습니다, 여기에 원 - 무료 버전은 없습니다 :

return x1+1+(x1+1==x2); 

그리고 당신은 바로 비트 조작 그것을 구현하는 many ways가, 조건은 여전히 ​​부정 행위를 생각한다면, 걱정하지 마십시오.

덧셈 솔루션은 서명 된 오버플로 (UB) 가능성을 유도하기 때문에 실제로는 부호없는 정수에만 유효합니다. 이것이 중요한 경우 추가 작업을 다른 작업 (예 : x1^(1+(x1^1==x2))으로 바꿀 수 있습니다.

+1

플래그 레지스터에서'=='로 엿보는 중입니다. 이것은 암시적인'if'입니다. –

+1

감각이없는 @PaulOgilvie –

+0

M-m, 나는 당신을 얻지 못한다. 모든 if 문은 플래그 레지스터를 사용하여 제로 플래그, 캐리 플래그 또는 기타 플래그와 같은 조건의 결과를 가져와야합니다. 반대의 경우도, 플래그 레지스터의 사용은 if를 의미합니다. 'x1 + 1 == x2'라는 표현은 동등성을 테스트 할 때 제로 플래그를 사용합니다. –