C/C++/비트/쉬프트2012. 9. 2. 13:47


 

 음수

0

양수 

-1

0

2

-1 

3

-1 

0

1

4

0

1


Integer의 부호를 위의 표와 같이 4가지 방법으로 분류하는 방법


int v // 부호를 판별할 정수 값

int sign // v의 부호


1. -1 / 0 / 0


sign = -(v < 0); // 가장 기본적인 방법


sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1); // 쉬프트 사용

// 이식성이 좋음

// CHAR_BIT는 char의 비트수


sign = v >> (sizeof(int) * CHAR_BIT - 1);

// 위의 코드의 단순한 버젼

// 오른쪽 쉬프트 연산자가 MSB를 우측으로 복사한다면 가용 가능

// VC++은 확실히 그러하지만, 다른 것들도 그런다는 보장은 없음


sign = v >> 31;

// 최대로 단순한 버젼

// 오른쪽 쉬프트 연산자가 MSB를 우측으로 복사하고

// int의 비트수가 31이면 사용 가능


2. -1 / 1 / 1


sign = 1 | -(v < 0);

sign = 1 | (v >> (sizeof(int) * CHAR_BIT - 1));

sign = 1 | (v >> 31);


3. -1 / 0 / 1


sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT -1));

sign = (v > 0) - (v < 0);


4. 0 / 1 / 1


sign = 1 ^ ((unsigned int)v >> 31);



출처 : http://graphics.stanford.edu/~seander/bithacks.html

Posted by 투명테잎