Чтение отдельных битов из памяти

#c #pointers #memory

#c #указатели #память

Вопрос:

Чтобы преобразовать число из базы 10 в базу 2, я подумал о прямом чтении битов из памяти вместо выполнения bitshift ( >> ) .

Рассмотрим программу:

 int n = 14;
bool* pointer = (bool*)amp;n;
for(int i = 0; i < 32; i  )
    cout << *(p   i);
  

Программа выдает неверный вывод.

Приведенная ниже программа работает:

 int n = 14;
bool *p = (bool*)amp;n;
for(int i = 0; i < 32; i  ){
    cout << *p;
    n = n >> 1;
}
  

Смещение битов тратит ненужное время. Также, пожалуйста, укажите на ошибку в первом фрагменте кода.

Комментарии:

1. «Смещение битов тратит ненужное время». — В чем ваша проблема? Производительность? Как вы профилировали или тестировали? Чего вы ожидали? Что такое код на ассемблере? Почему вы ожидаете, что у an int будет 32 бита? Почему a bool с 32 битами? Что ваша реализация говорит о сдвиге вправо целого числа со знаком?

2. Вы, кажется, предполагаете, sizeof bool == 32 / 8 что это неправильно.

3. Если вы считаете, что смещение битов — пустая трата времени, вы, вероятно, никогда не читали руководство по вашему процессору.

4. A bool — это не бит. Нет способа адресовать отдельные биты.

5. Если вы хотите прочитать биты из памяти, вы можете выполнить цикл и проверить, является ли i бит th 1 или 0 как n amp; (1 << i)

Ответ №1:

Если вы действительно обеспокоены тем, что сдвиг слишком дорогой (что действительно верно только для некоторых старых процессоров, например, 68008), вы можете работать с постоянными битовыми масками следующим образом:

 const unsigned int table [] = {0x00000001, 0x00000002, 0x00000004, 0x00000008,
                               0x00000010, 0x00000020, 0x00000040, 0x00000080,
                               // ...rinse and repeat until bit 31....
                              };

int isSet (unsigned int value, int bitNo) {
   return ((value amp; table [bitNo]) != 0);
}
  

То, что вы показали выше, не будет работать по множеству причин, некоторые из которых указаны в полученных вами комментариях.