从 C 中的多个值创建地址

Creating addresses from multiple values in C

我试图通过组合我拥有的多个无符号整数值在 C 中创建 32 位地址。这多个值很重要,需要全部存入1个32位地址。

例如:假设我有 unsigned int outer = 25unsigned int inner = 984unsigned int offset = 3241。 outer int 在 32 位地址中有高 10 位,inner int 在 32 位地址中有 10 位中间位,offset 有剩余的 12 位来存储它的数字。

它看起来像:

OUTER | INNER | OFFSET
  10      10      12    = 32 bit address

我知道,在这个例子中,外部和内部整数可以存储 0 - 2^10-1 的值,偏移量可以存储 0 - 2^12-1 的值,但是有了这些值我'我不确定如何根据它们在 32 位地址中可以拥有的位数将它们拆分,然后 forge/merge 将所有内容分解为整个地址。

不确定这是否符合您的目标,但如果您允许,您可以像这样制作一个结构

typedef struct {
  union {
    struct {
      unsigned int offset : 12;
      unsigned int outer : 10;
      unsigned int inner : 10;
    } bits;
    unsigned int address;
  }
} Address;

int main() {
  Address a;

  a.bits.offset = 3241;
  a.bits.inner = 25;
  a.bits.outer = 984;
  printf("outer: %u\ninner: %u\noffset: %u\naddress: %08x", a.bits.outer,
         a.bits.inner, a.bits.offset, a.address);
  return 0;
}

输出

outer: 984 
inner: 25     
offset: 3241   
address: 067d8ca9 

尽管这取决于特定体系结构和编译器的字节顺序和位域处理。

根据@user3386109回答:

address = (outer << 22) | (inner << 12) | offset;