gpt4 book ai didi

c++ - 访问位集中的多个位

转载 作者:行者123 更新时间:2023-11-30 04:21:03 26 4
gpt4 key购买 nike

我正在编写一个缓存模拟器,其中使用了 32 位地址。我使用 bitset<32> 来存储地址。当我尝试访问多位地址进行解码时出现问题。例如:

int index = address[index_MSB, index_LSB].to_ulong();

我尝试访问地址中的某些位并转换为 int。它会导致错误。有什么办法吗?谢谢!

例子:

地址 = 0x12345678;

index_MSB = 5;

index_LSB = 2;

我需要从 address[2] 到 address[5] 的 4 位,这里是 1110,并转换为 int 值:14。

最佳答案

访问数字中的位的通常方法是在数字和掩码之间执行与运算。例如

number = 0xFFAA0055; // an example
bit17 = 1 << 17; // counting bit0 as the least significant bit

bit17set = number & bit17;

如果位 17 为 1,则 bit17set 将为 true,因为只有这样逻辑 AND 才会产生非零结果。

如果您对多个位感兴趣,您可以简单地在 AND 之前对它们的掩码求和:

bit6 = 1 << 6;

bit6or17 = bit6 + bit17;
bit6or17set = number & bit6or17;

当你想要从MSB到LSB的地址位时,最简单的操作是:

temp = number >> LSB; // this shifts LSB numbers to the right
answer = temp & ((1<<(MSB-LSB+1) - 1); // a mask of MSB-LSB bits

您当然可以将这两者结合起来:

int index = ((address >> index_LSB) & (1<<(index_MSB - index_LSB+1)-1)).to_ulong();

注意:以上所有假设都是“正常”数字,其中位存储“常规”。如果您的地址包含上述方法无法访问的位,您可以改为执行以下操作:

int ii, index=0;
for(ii=index_MSB; ii>= index_LSB; ii--) {
index = (index << 1) + address[ii];
}

关于c++ - 访问位集中的多个位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14845021/

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