Bitmask应该被提升到更多的可能性

Bitmask should be advanced to more possibilieties

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

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

第一个定义的位掩码块扩展为二进制表示如下。

#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