|
음수 |
0 |
양수 |
1 |
-1 |
0 |
0 |
2 |
-1 |
1 | 1 |
3 |
-1 |
0 | 1 |
4 |
0 |
1 | 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);
'C/C++ > 비트/쉬프트' 카테고리의 다른 글
분기 없이 정수의 절대값 구하기 (0) | 2012.09.02 |
---|---|
두 정수의 부호가 다름을 판별 (0) | 2012.09.02 |
비트수가 같은 다음 수(Next Higher or Lower Number with same number of binary bits set) (0) | 2012.06.05 |
추가 메모리 없이 두 정수 교환하기(Integer Swap) (0) | 2012.06.01 |
int형 변수에서 1인 비트수(비트개수) 구하기 (0) | 2011.11.12 |