논리 연산이없는 getMax () 함수
int getMax(int a, int b){
return (a+b+((a-b)>>sizeof(int)*8-1|1)*(a-b))/2;
}
설명:
'최대'를 조각으로 부수고
max
= ( max + max ) / 2
= ( max + (min+differenceOfMaxMin) ) / 2
= ( max + min + differenceOfMaxMin ) / 2
= ( max + min + | max - min | ) ) / 2
따라서 함수는 다음과 같아야합니다.
getMax(a, b)
= ( a + b + absolute(a - b) ) / 2
지금,
absolute(x)
= x [if 'x' is positive] or -x [if 'x' is negative]
= x * ( 1 [if 'x' is positive] or -1 [if 'x' is negative] )
정수 양수에서 첫 번째 비트 (부호 비트)는 -0입니다 . 음수는 -1 입니다. 비트를 오른쪽 (>>)으로 이동하여 첫 번째 비트를 캡처 할 수 있습니다.
오른쪽 시프트 동안 빈 공간은 부호 비트로 채워집니다. 따라서 01110001 >> 2 = 00011100 , 반면 10110001 >> 2 = 11101100 .
결과적으로 8 비트 숫자 시프 팅의 경우 7 비트는 음의 경우 1 1 1 1 1 1 [0 또는 1] , 양의 경우 0 0 0 0 0 0 0 [0 또는 1] 을 생성합니다.
이제 00000001 (= 1)으로 OR 연산을 수행 하면 음수는 11111111 (= -1) , 양수 -00000001 (= 1)이 됩니다.
그래서,
absolute(x)
= x * ( 1 [if 'x' is positive] or -1 [if 'x' is negative] )
= x * ( ( x >> (numberOfBitsInInteger-1) ) | 1 )
= x * ( ( x >> ((numberOfBytesInInteger*bitsInOneByte) - 1) ) | 1 )
= x * ( ( x >> ((sizeOf(int)*8) - 1) ) | 1 )
드디어,
getMax(a, b)
= ( a + b + absolute(a - b) ) / 2
= ( a + b + ((a-b) * ( ( (a-b) >> ((sizeOf(int)*8) - 1) ) | 1 )) ) / 2
또 다른 방법 -
int getMax(int a, int b){
int i[] = {a, b};
return i[( (i[0]-i[1]) >> (sizeof(int)*8 - 1) ) & 1 ];
}
<
.