본문 바로가기
자료구조와 알고리즘/[서적] 해커의 기쁨 : 비트와 바이트 그리고 알고리즘

2. 비트 연산으로 절댓값 함수 만들기

by 헛둘이 2022. 9. 11.
비트 연산으로 절댓값 함수 만들기
  • 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과 동일한 결과가 나오게 된다.

댓글