#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 бита? Почему abool
с 32 битами? Что ваша реализация говорит о сдвиге вправо целого числа со знаком?2. Вы, кажется, предполагаете,
sizeof bool == 32 / 8
что это неправильно.3. Если вы считаете, что смещение битов — пустая трата времени, вы, вероятно, никогда не читали руководство по вашему процессору.
4. A
bool
— это не бит. Нет способа адресовать отдельные биты.5. Если вы хотите прочитать биты из памяти, вы можете выполнить цикл и проверить, является ли
i
бит th1
или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);
}
То, что вы показали выше, не будет работать по множеству причин, некоторые из которых указаны в полученных вами комментариях.