应该将位掩码推进到更多可能性

时间:2017-02-17 11:33:36

标签: c++ c++11 bitmask

我想做一个位掩码。已经采用了以下定义。

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

1 个答案:

答案 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