int isGreater(int x, int y) {
/* boolean value of sign x is 1 = negative, 0 = non-neg */
int sign_x = x >> 31;
/* boolean value of sign y is 1 = negative, 0 = non-neg */
int sign_y = y >> 31;
/* if x is larger, sign bits of (~y + x) is 0
if y is larger, sign bit of (~y + x) is 1 */
int equal = !(sign_x ^ sign_y) & ((~y + x) >> 31);
/* if signs are opposite, then reverse */
int notEqual = sign_x & !sign_y;
/* this returns 0 when x is >, so we take the negation */
return !( equal | notEqual);
}
x - y의 결과를 보려면 (x + ~y)가 아니라 (x + (~y + 1))을 해야 하는거 아님? 이해가 안되네
*수정 x > y일 경우라서 그냥 0일 경우도 무시하려고 +1 안한듯, 여기는 이해했는데 부호 부분이 여전히 이해가 안되네
막줄에서 조건이 바뀌는 것에 조심. x > y가 아니라 y >= x인지를 검사하고 있음. "y >= x"는 "y+1 > x", "x-(y+1) < 0", "x+~y < 0"과 동치. 단, x+~y가 오버플로우되면 안 됨. x와 y의 부호가 같다면 오버플로우가 안 되니 이 조건을 바로 쓸 수 있고 (equal), 다르다면 부호 비트로 대소관계를 바로 파악할 수 있음 (notEqual).
notequal로 어떻게 대소관계가 바로 파악되는지 물어봐도 됨? 저건 부호가 같은지 다른지만 판단할 수 있는거 아님?
아 이해했다