如何制作仅屏蔽 32 位的某些部分(索引)的位掩码?

How do I make a bit mask that only masks certain parts (indices) of 32 bits?

我目前正在做一个编程作业,其中我必须只屏蔽整个 32 位数字的某个索引(例如:如果我将 8 个 4 位数字放入我的 32 位整数中,我会有 8 个索引,每个索引有 4 位)。我希望能够仅打印整个 32 位中的部分位,这可以通过屏蔽来完成。如果位只在一个地方,我不会有问题,因为我会创建一个掩码,将 1 放在一个固定的位置(例如:00000000 00000000 00000000 00000001)。但是,我需要能够只在一个索引中移动掩码来打印每个位(例如:我想用我的 0001 掩码遍历第一个索引,每次都向左移动 1,但我不想在之后继续该索引的第三位)。我知道我需要一个循环来完成这个;但是,我很难思考如何完成这部分作业。任何提示、建议或更正将不胜感激。另外,如果这很难理解,我很抱歉,但我找不到更好的表达方式。谢谢。

首先是关于代表性。您需要二进制数来表示位和掩码。至少在 c++14 之前,没有直接用 c/c++ 语言实现的二进制文件。因此,在 c++14 之前,您必须使用十六进制或八进制来表示您的二进制文件,即

0000 1111 == 0x0F
1111 1010 == 0xFA

从 c++14 开始你可以使用

0b00001111;

现在,如果你将你的二进制掩码向左或向右移动,你将得到以下图片

00001111 (OxF) << 2 ==> 00111100 (0x3C)
00001111 (0xF) >> 2 ==> 00000011 (0x03)

现在,假设您有一个数字,您对其中的位 4 到 7(4 位)感兴趣

int bad = 0x0BAD; // == 0000 1011 1010 1101

您可以创建一个面具

int mask = 0x00F0; // == 0000 0000 1111 00000

并按位 and

int result = bad & mask; // ==> 0000 0000 1010 000 (0x00A0)

您将屏蔽单词中间的 4 位,但它会打印为 0xA0。可能不是你所期望的。要将其打印为 0xA,您需要将结果右移 4 位:result >> 4。我更喜欢以有点不同的顺序来做,先移动 'bad' 然后掩码:

int result = (bad >> 4) & 0xF;

希望以上内容能帮助您理解位。