C++/Code snippet
[C++] 비트 마스크 출력하는 예제
i5
2025. 6. 30. 00:51
반응형
1. 비트 검사를 통한 동적 생성 (확장성 좋음)
#include <iostream>
#include <string>
#include <vector>
std::string getMaskName(int mask) {
std::vector<std::pair<int, std::string>> flags = {
{0x01, "A"},
{0x02, "B"},
{0x04, "C"}
};
std::string result;
bool first = true;
for (const auto& flag : flags) {
if (mask & flag.first) {
if (!first) {
result += "|";
}
result += flag.second;
first = false;
}
}
return result.empty() ? "Unknown" : result;
}
int main() {
std::cout << getMaskName(0x01) << std::endl; // A
std::cout << getMaskName(0x03) << std::endl; // A|B
std::cout << getMaskName(0x07) << std::endl; // A|B|C
return 0;
}
2. enum class와 연산자 오버로딩 사용 (타입 안전성 높음)
#include <iostream>
#include <string>
#include <vector>
enum class Flag {
A = 0x01,
B = 0x02,
C = 0x04
};
Flag operator|(Flag a, Flag b) {
return static_cast<Flag>(static_cast<int>(a) | static_cast<int>(b));
}
std::string to_string(Flag flag) {
std::vector<std::pair<Flag, std::string>> flags = {
{Flag::A, "A"},
{Flag::B, "B"},
{Flag::C, "C"}
};
std::string result;
bool first = true;
int mask = static_cast<int>(flag);
for (const auto& f : flags) {
if (mask & static_cast<int>(f.first)) {
if (!first) {
result += "|";
}
result += f.second;
first = false;
}
}
return result.empty() ? "Unknown" : result;
}
int main() {
Flag f1 = Flag::A;
Flag f2 = Flag::A | Flag::B;
Flag f3 = Flag::A | Flag::B | Flag::C;
std::cout << to_string(f1) << std::endl; // A
std::cout << to_string(f2) << std::endl; // A|B
std::cout << to_string(f3) << std::endl; // A|B|C
return 0;
}
3. 전역으로 벡터 배열을 사용하는 방법
#include <iostream>
#include <string>
#include <vector>
// 전역으로 flags 벡터 선언 및 초기화
const std::vector<std::pair<int, std::string>> flags = {
{0x01, "A"},
{0x02, "B"},
{0x04, "C"}
// 필요시 여기에 추가 플래그를 계속해서 정의할 수 있음
};
std::string getMaskName(int mask) {
std::string result;
bool first = true;
for (const auto& flag : flags) {
if (mask & flag.first) {
if (!first) {
result += "|";
}
result += flag.second;
first = false;
}
}
return result.empty() ? "Unknown" : result;
}
int main() {
std::cout << getMaskName(0x01) << std::endl; // A
std::cout << getMaskName(0x03) << std::endl; // A|B
std::cout << getMaskName(0x07) << std::endl; // A|B|C
std::cout << getMaskName(0x05) << std::endl; // A|C
return 0;
}
참고자료
반응형