从C中的多个值创建地址

问题描述 投票:1回答:2

我正在尝试通过组合多个具有的无符号int值在C中创建32位地址。这些多个值很重要,需要全部存储到1个32位地址中。

例如:假设我有unsigned int outer = 25unsigned int inner = 984unsigned int offset = 3241。外部int在32位地址中具有10个高位,内部int在32位地址中具有10个中位,而offset具有其余12位以存储其编号。

它看起来像:

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

我知道,在此示例中,外部和内部整数可以存储0-2 ^ 10-1的值,而偏移量可以存储0-2 ^ 12-1的值,但是对于这些值,我不确定如何根据它们在32位地址中可以拥有的位数拆分它们,然后将所有内容伪造/合并到整个地址中。

c bit-manipulation bit
2个回答
0
投票

不确定这是否符合您的目标,但是如果您允许,可以像这样进行设计

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 

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


0
投票

根据@ user3386109的答案:

address = (outer << 22) | (inner << 12) | offset;
© www.soinside.com 2019 - 2024. All rights reserved.