2017-02-17 7 views
1

私はビットマスクを作りたいと思います。以下の定義はすでに採用されています。定義とそれを次にビットマスクをより多くの可能性に進化させる必要があります

#define SEC_NO_FLAGS 0x000 
#define SEC_ALLOC  0x001 
#define SEC_LOAD  0x002 
#define SEC_RELOC  0x004 
#define SEC_READONLY 0x008 
#define SEC_CODE  0x010 
#define SEC_DATA  0x020 
#define SEC_ROM  0x040 

は、私がuint32_t ptr = 0;初期化し、私のことができOR:

ptr |= SEC_ALLOC; 

を今、私は定義を拡張したい:

#define SEC_CORE_1  0x080 
#define SEC_CORE_2  0x0F0 
#define SEC_CORE_3  0x110 
#define SEC_CORE_4  0x120 
#define SEC_CORE_5  0x140 
#define SEC_CORE_6  0x180 

がどのように選択する必要があります上記でユニークなビットマスクを持つことを定義していますか?

しかし、私はビットマスクをテストします。

std::string 
ParseManager::mapFlags(uint64_t flag) 
{ 
    std::string tmp = ""; 

    if (flag & SEC_ALLOC) 
    { 
    tmp.append("a"); 
    } 

    if (flag & SEC_CODE) 
    { 
    tmp.append("x"); 
    } 

    if (flag & SEC_READONLY) 
    { 
    tmp.append("r"); 
    } 

    if (flag & SEC_DATA) 
    { 
    tmp.append("w"); 
    } 

    if (flag & SEC_LOAD) 
    { 
    tmp.append("l"); 
    } 

    if (flag & SEC_CORE_1) 
    { 
    tmp.append("c1"); 
    } 

    if (flag & SEC_CORE_2) 
    { 
    tmp.append("c2"); 
    } 

    if (flag & SEC_CORE_3) 
    { 
    tmp.append("c3"); 
    } 

    if (flag & SEC_CORE_4) 
    { 
    tmp.append("c4"); 
    } 

    if (flag & SEC_CORE_5) 
    { 
    tmp.append("c5"); 
    } 

    if (flag & SEC_CORE_6) 
    { 
    tmp.append("c6"); 
    } 

    return tmp; 
} 
+1

定数式 '1 << 0'、 '1 << 1'、 '1 << 2'など – MSalters

答えて

2

定義されたビットマスクの最初のブロックは、次のように2進表現に展開されます。

#define SEC_NO_FLAGS 0x000 0000 0000 0000 0000 0000 
#define SEC_ALLOC  0x001 0000 0000 0000 0000 0001 
#define SEC_LOAD  0x002 0000 0000 0000 0000 0010 
#define SEC_RELOC  0x004 0000 0000 0000 0000 0100 
#define SEC_READONLY 0x008 0000 0000 0000 0000 1000 
#define SEC_CODE  0x010 0000 0000 0000 0001 0000 
#define SEC_DATA  0x020 0000 0000 0000 0010 0000 
#define SEC_ROM  0x040 0000 0000 0000 0100 0000 

これらはすべて正確に1つのビットが設定されています。これはすべての値が異なるビットです。ビットマスクの第2のブロックは以下のように見える。

#define SEC_CORE_1  0x080 0000 0000 0000 1000 0000 
#define SEC_CORE_2  0x0F0 0000 0000 0000 1111 0000 
#define SEC_CORE_3  0x110 0000 0000 0001 0001 0000 
#define SEC_CORE_4  0x120 0000 0000 0001 0010 0000 
#define SEC_CORE_5  0x140 0000 0000 0001 0100 0000 
#define SEC_CORE_6  0x180 0000 0000 0001 1000 0000 

新しく定義されたビットマスクは、以前に定義されたビットマスクとは異なりますが、いくつかのビットを共有します。例えば、SEC_CORE_2は、SEC_CODEに設定されたビットを含む。値を互いに独立してビットマスクとして使用する必要がある場合は、同じビットを共有することはできません。たとえば、以下の値で実現できます。

#define SEC_CORE_1  0x0100 0000 0000 0001 0000 0000 
#define SEC_CORE_2  0x0200 0000 0000 0010 0000 0000 
#define SEC_CORE_3  0x0400 0000 0000 0100 0000 0000 
#define SEC_CORE_4  0x0800 0000 0000 1000 0000 0000 
#define SEC_CORE_5  0x1000 0000 0001 0000 0000 0000 
#define SEC_CORE_6  0x2000 0000 0010 0000 0000 0000 
+0

を使用することである明確な方法私はいつもこのエラーを取得しています: 警告:整数定数がその型の大きさが大きすぎる場合 (flag&SEC_CORE_6) – j35t3r

関連する問題