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;
}

 

 

참고자료

https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/telephony/java/android/telephony/data/ApnSetting.java;drc=61197364367c9e404c7da6900658f1b16c42d0da;l=1567?q=APNSetting

 

반응형