[ 진수 ] |
2진수 => 0~1
8진수 => 0~7
16진수=> 0~9, a~f
─────────────────────────────────────────────
부호비트가 1이면 음수 0이면 양수다. (부호비트는 [1]0000000 )
음수를 표현할 때에는 2의 보수 체계를 기억해야 한다.
00000101 = 10진수 +5 가 된다.
이것을
11111010 ->1의 보수를 취한다.
11111011 ->1을 더한다. 이 값이 음수 -5값이 된다.
이값이 왜 -5인가 하면, 2의 보수 를 취하기 전에 10진수 정수값인 5였으며,
부호의반전으로 -를 붙인거뿐 바뀐건 없다.
─────────────────────────────────────────────
[ 비트 연산자 종류 ] |
& | 비트단위 AND |
| | 비트단위 OR |
| 비트단위 XOR |
~ | 비트단위 NOT |
<< | 왼쪽으로 이동 |
>> | 오른쪽으로 이동 |
예제
결과
& 연산 => 둘다 1이면 1, 아니면 0
| 연산 => 둘 중 하나만 1이어도 1, 둘다 0일때 0
^ 연산 => 둘다 다르면 1, 같으면 0
~ 연산 => 해당변수의 모든비트를 반전, MSB(부호비트)도 반전이 되므로 음수가 됩니다. 1의 보수를 취한후 1을 더하면 음수값을 알수 있습니다.
<< 연산 => 비트단위로 n회 왼쪽으로 이동시킵니다. 이동한 만큼 비는 공간은 0으로 채워지며, 왼쪽 끝에 도달하여 더 이상 갈 수 없을 경우 해당 비트는 삭제됩니다. 1비트씩 이동 할 때 마다 값이 2배가 됩니다.
>> 연산 => 비트단위로 n회 오른쪽으로 이동 시킵니다. 이동 한 만큼 왼쪽 끝의 비트는 0으로 채워지며, 오른쪽 끝에 도달하여 더이상 갈 수 없을 경우 비트는 삭제됩니다. 그러나 음수일 경우 왼쪽의 비트 처리가 시스템에 따라 달라집니다. 음수를 유지하기 위해 1로 채워질 수도 있고, 0으로 채워질수도 있습니다.
─────────────────────────────────────────────
[ 비트 연산의 필요성 ] |
중요한건 비트연산을 왜쓰냐는건데 ...
난!
하나의 변수에 특성,속성,옵션을 지정할때 쓴다.
exmaple_1. 메시지박스
#define DF_OKBUTTON 0x0001
#define DF_CANCELBUTTON 0x0002
option |= ok_button
검사
if( option & ok_button ){
printf("OK_button \n");
}
exmaple_2. 착용무기
결과
상태 구분 방법은 BOOL 변수로 TRUE, FALSE 로 구분하는 방법은 있다.
하지만, 상태값이 3개나 10개, 30개라면 3, 10, 30개씩 BOOL값이 필요하다.
이는 심한 메모리 낭비를 불러오고, 각 플래그의 상태를 확인하기 위하여 함수의 매개변수갯수가
플래그의 갯수만큼이 될 것이다.
8bit로 8개의 상태를 체크할 수 있다.
int형(4byte) 하나면 32개의 상태를 체크할 수 있다.
즉!
iHand 변수에 무기가 여러개가 들어가게되는데, 비트연산이 아니라면 변수 하나에 무기를
바꿀수만 있지 다중으로 적용은 안된다.
배열처럼 다중 변수 선언이 되야한다.
검[0] =true;
창[1] =true;
하지만, 속성이 늘어날수록 변수는 늘어나고, 메모리에 비효율적인것이다.
ex 검, 검창, 검활, 검창활 등 경우의 수는 계속 늘어나게 된다.
결론은
비트연산은 자신의 소스에 알맞게 적용해서 사용하면 효율적이다
────────────────────────────────────────
[ 참고 ] |
0x00000001
0x00000002
0x00000004
0x00000008
0x00000010
위는 16진수 표기로 비트를 표현한건데, 16진수는 하나당 비트 4비트이다.
이건 2진수 1111 => 10진수로 15인데, 16진수는 10진수 15(f)까지 표시가 가능하다.
즉 16진수는 표기는 하나당 (1111)4비트가 된다. 위에 선언은 총 4 * 8 =32bit가 선언된것이다.
그런데 2n승의 값으로 선언이 되어있는데, 이것은 잘 만 생각해보면 이해할수있다.
0001 = > 1 [검]
0010 = > 2 [활]
0011 = > 3 [총]
2진수의 10진수로 바꾸면 이렇게 되는데,
hand = 0001 | 0010;
[검]과 [활]을 적용시키면 [총]이 된다. 머.. 이상할껀 없다. [검] [활] [총]까지 모두 검출 할 수 있다.
하지만, 난 분명, 검과 활만 적용시켰는데 총까지 적용되었다.
결과적으로 비트가 중첩되는 현상이 생겼다.
중첩이 된다면, 위에 예시처럼 의도 하지 않는 속성이 들어 간다.
2n승의 값 으로 비트를 선언해야 하겠다.
────────────────────────────────────────
[ 옵션 함수 처리 ] |
void SetOption(DWORD dwOption, BOOL bSet)
{
// 옵션 적용
if (bSet == TRUE) {
m_dwOptions |= dwOption;
}
else {
m_dwOptions &= ~dwOption; //<옵션해제
}
}
'0x0001 > C, C++' 카테고리의 다른 글
[C언어] 문자열 함수, 구조체, 공용체, 열거형 (0) | 2019.02.07 |
---|---|
[C언어] 배열, 포인터, 함수 호출방식 (0) | 2019.02.07 |
[C언어] 전역변수, 지역변수, static, extern 키워드 (0) | 2019.02.07 |
[C언어] goto문, 연산자(증감,대입,sizeof) (0) | 2019.02.07 |
[C언어] 변수, 데이터 표현, 기본자료형, 서식문자 (0) | 2019.02.07 |