2014-03-25 2 views
0

"해커의 즐거움"책에서는 숫자의 절대 값이 (х XOR у) - у, y = x >> 31 인 예제가 있습니다.비트 연산을 통한 절대 값 계산 방법

이 표현 y = x >> 31이 x의 부호를 얻는다는 것을 알고 있습니다. 부울 대수를 이해하지만이 표현이 어떻게 작동하는지 이해할 수 없습니다. 자세한 설명이 필요합니다. 도와주세요.

+0

gcc는 현재 x86에서 정수 절대 값을 구현할 때 이것을 사용합니다. 실제로 가장 빠른 방법은 아닙니다. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67510 –

답변

1

그것은 two's complement의 정의에서 다음, -x = ~x + 1

x 경우 음수 : y = x>>31 = -1. 얻을, x^-1~x 반전을 다시 작성하고, -1 뺀로 +1 :

-x = (x^-1) - -1 = abs(x) 

경우 x이 아닌 음수 : y = 0(x^0) - 0) 분명히 단지 x입니다.

0

(x XOR y) - y는 음수에서 2의 보수를 수행하는 중입니다. 양수인 경우 y는 0이되므로 x는 변경되지 않습니다.

예. x = -2이다.

-2는 0xFFFFFFFE로 표현

X >> 31는 Y (즉. -1)

Y가 결과를주는 X의 모든 비트를 반전 할 X XOR 0x00000001로서

0xFFFFFFFF입니다 = 것

(x XOR y) - y = 0x00000001 - (-1) = 0x00000002.