티스토리 뷰

C++ bit OR 연산

여러개의 설정값(True of False - Flag)를 저장하고 확인할 때, 유용하게 사용할 수 있는 방법이다.


구조체를 선언해 여러 개의 bool 변수를 만들어 주거나, 또는 단순히 여러 개의 FLAG이름을 붙인 bool 형식 변수를 만들어도 되지만,

bit 연산을 통해 변수 하나에 여러 개의 flag(true or false) 설정값을 저장할 수 있다.



위 사진은 VC++ 의 기본 헤더 파일인 "winnt.h" 에 정의되어 있는 것 중 PE 포맷의 NT_FILE_HEADER (COFF)에 쓰이는 Characteristics 상수 설정값이다. <MSDN>

각각의 설정 값이 비트 단위와 딱 맞아떨어져, 여러 값이 설정되도 서로 다른 비트를 침범하지 않아 여러 설정(flag)를 저장할 수 있다.

쉽게 말해 bool 형식의 자료형을 배열로 선언한 것과 비슷하며, 총 자료형의 길이(BIT_LENGTH) - 1 개의 설정값(Flag)를 저장할 수 있다.

[!] 추후 설명 오류를 수정할 것. + Linux의 ELF 플래그 확인 커널 소스 확인.


연습용 참고 소스:

#include "stdafx.h"
#include <WTypes.h> // need for reference IMAGE_FILE*
// VC++ 10.0

int main() {
	short int CONFIG = 0;
	CONFIG += IMAGE_FILE_EXECUTABLE_IMAGE;
	CONFIG += IMAGE_FILE_32BIT_MACHINE;

	bool flag = 0;
	for (int i = 0; i < sizeof(short int) * 8; i++)
	{
		flag = (CONFIG >> i) & 1;
		
		// 효율적인 코드가 아닌 것 같음.
		// 추후 ELF 포맷 볼 때 리눅스 커널 소스를 참조할 것.
		switch (i)
		{
		case 1:
			if (flag) printf("F IMAGE_FILE_EXECUTABLE_IMAGE ON\n");
			else printf("F IMAGE_FILE_EXECUTABLE_IMAGE OFF\n");
			break;
		case 2:
			if (flag) printf("F IMAGE_LINE_NUMS_STRIPPED ON\n");
			else printf("F IMAGE_LINE_NUMS_STRIPPED OFF\n");
			break;
		case 8:
			if (flag) printf("F IMAGE_FILE_32BIT_MACHINE ON\n");
			else printf("F IMAGE_FILE_32BIT_MACHINE OFF\n");
			break;
		}
	}
}


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함