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

时间:2017-09-06 01:01:11

标签: c++ bit-shift bits bitmask

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

1 个答案:

答案 0 :(得分:3)

首先关于代表性。您需要二进制数来表示位和掩码。至少在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。我更喜欢按照不同的顺序进行,改变“糟糕”的情况。首先然后掩盖:

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

我希望上面的内容能帮助你理解这些内容。