Создание адресов из нескольких значений в C - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь создать 32-битные адреса в C путем объединения нескольких значений типа unsigned int, которые у меня есть. Эти множественные значения важны и должны храниться в 1 32-битном адресе.

Например: скажем, у меня есть unsigned int outer = 25, unsigned int inner = 984, unsigned int offset = 3241. Внешний int имеет 10 старших битов в 32-битном адресе, внутренний int имеет 10 средних битов в 32-битном адресе, а смещение имеет оставшиеся 12 битов для хранения своего номера.

Это будет выглядеть примерно так:

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

Я знаю, что в этом примере внешние и внутренние целые числа могут хранить значения от 0 до 2 ^ 10-1, а смещение может хранить значения от 0 до 2 ^ 12-1, но с этими значениями я не уверен, как разделить их по количеству бит, которые они могут иметь в пределах 32-битного адреса, а затем подделать / объединить все в целый адрес.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Ответ в соответствии с @ user3386109:

address = (outer << 22) | (inner << 12) | offset;
0 голосов
/ 02 апреля 2020

Не уверен, что это соответствует вашей цели, но если бы вы позволили, вы могли бы создать структуру для этого следующим образом:

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 

Хотя это зависит от порядка байтов и обработка битовых полей для конкретной архитектуры и компилятора.

...