gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:34:07 27 4
gpt4 key购买 nike

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

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

最佳答案

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

#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

所有这些都恰好设置了一个位,每个值都是不同的位。第二个位掩码 block 如下所示。

#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

关于c++ - Bitmask应该被提升到更多的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42296874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com