我想做一个位掩码。已经采用了以下定义。
#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;
,我可以将它与定义:
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
如何选择上面的定义以获得唯一的位掩码?
但是,如果我测试位掩码。它打印几个c:
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;
}
答案 0 :(得分: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
所有这些都只有一位设置,这是每个值中的不同位。第二个位掩码块如下所示。
#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