비트 연산으로 절댓값 함수 만들기
- y = x >> 31 (음수면 1로 채워지고, 양수면 0으로 채워진다.)
(x ^ y) - y
#include <iostream>
#include <bitset>
using namespace std;
typedef unsigned char BYTE;
int main()
{
int t1 = -61;
bitset<8> showBit = t1;
cout << "before: " << showBit << endl;
int t2 = t1 >> 31;
showBit = t2;
// 비트를 우측으로 31칸 밀어서 0 또는 1으로 초기화
// t1이 양수일 경우 t2 : 00000000
// t1이 음수일 경우 t2 : 11111111
cout << "t2 : " << showBit << endl;
cout << bitset<8>(t1) << " - " << bitset<8>(t2) << endl;
t1 = (t1 ^ t2) - t2;
cout << (int)t1 << endl;
// 1. (t1 ^ t2) = t3
// 1-1. t1이 양수일 경우 t2 = 00000000
// 1-2. t1이 음수일 경우 t2 = 11111111
// = 11000011(t1) ^ 11111111(t2) = 00111100
//
// 2. t3 - t2 (t3 - t2는 다시 t3 + t2의 2의 보수)
// = 00111100 - 11111111
// = 00111100 + 00000001 (t2의 2의 보수)
// = 00111101 (최종 결과값)
showBit = t1;
cout << "after: " << showBit << endl;
}
- t1 = -61(11000011)의 절댓값인 61을 구하는 함수
- t1이 음수라면 t2는 11111111이 돼서 t1의 반전된 값을 가지게 되고
- t1이 양수라면 t2는 00000000이 돼서 t1 그대로의 값을 가지게 된다.
- 그래서 그 수의 2의 보수를 취한 값을 더하게 되는데
- 음수인 경우는 결국 반전된 값 + 1을 갖게 되므로 기존 값에서 2의 보수를 취한 것과 동일한 결과가 나온다.
- 양수인 경우는 00000000의 2의 보수는 다시 0이므로 t1과 동일한 결과가 나오게 된다.
댓글