如何对无符号长 int 进行位掩码?

  • 本文关键字:掩码 int 无符号 c++
  • 更新时间 :
  • 英文 :


我正在研究分支预测器的实现,因为我需要创建一个分支历史寄存器(BHR(,它将1111存储到unsigned int的前4位中,在每次预测之后。我们将从有限状态机获得输出,并使用左移更新到 BHR 中。你能为我解释一下该怎么做吗?

这是我尝试过的:

struct BHR
{
    long int BHR_index;
    unsigned input = 0b1111u, n_bits = 4u, *bits =new unsigned[n_bits], bit = 0;
};
int main(int argc, char** argv)
{
    long int table_size = 1227;
    BHR *table = new BHR[table_size];
    for(int  k = 0;k<=table_size;k++)
    {
        for(table->bit = 0; table ->bit < table ->n_bits; ++table->bit)
            table[k].bits[table -> bit] = (table -> input >> table ->bit)&1;
    }
    free(table->bits);
}

我像这样做了位屏蔽,但我在 Xcode 中收到线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x0(错误。谁能帮帮我。

如果"开始 4 位"是指(最不重要(的 4 位,那么此掩码将清除所有其他位,保持这 4 位不变:

unsigned long int someValue = 12345;
unsigned long int low4bits = someValue & 0xF;

此 AND 掩码(&运算符(的工作原理是清除目标中未在两个操作数中设置的所有位。因此,由于二进制中0xF的值...0001111,所有其他位将被清除。

如果你想要(最重要的(4位,那么你需要知道unsigned long int的大小(尽管见下文(。如果(通常(这是 32 位,那么您需要的掩码将如下所示:

unsigned long int someValue = 12345;
unsigned long int high4bits = someValue & 0xF0000000;

请随时要求进一步的解释和/或澄清。

编辑: 实际上,即使您不知道其实际大小,也有一种方法可以获得unsigned long int的高 4 位掩码,但它可能有点令人困惑。下面的代码可能不是最"有效"的方式;相反,它旨在说明该过程:

unsigned long int zeroValue = 0; // All bits are clear.
unsigned long int notZero = ~zeroValue; // ~ inverts all bits, so now all set
unsigned long int top4Clear = notZero >> 4; // shift set bits by 4, and zero-pad top 4
unsigned long int top4Mask = ~top4Clear; // Again, the ~ operator inverts all bits

有了这个top4Mask值,我们现在可以清除除高(最有效(位之外的所有位:

unsigned long int someValue = 12345;
unsigned long int high4bits = someValue & top4Mask;

另一种方法是使用为您执行位屏蔽的位字段:

struct ulong4b {
    unsigned long value : 4;
};
int main() {
    ulong4b a;
    a.value = 1; // Stores the lower 4 bits only.
    unsigned long value = a.value; // Reads the lower 4 bits only.
}

如果您想从数字中提取位,我认为此宏将为您提供帮助:

#define GET_BITS(number, offbits, nbits) (((number) >> (offbits)) & ((1 << (nbits)) - 1))
int x = 12345;
int last4bits = GET_BITS(x, 0, 4); // last4bits = x & 0x0000000F;
int first4bits = GET_BITS(x, 32 - 4, 4); // first4bits = x & 0xF0000000;

最新更新