Самый быстрый (не уверен, что это то, что вы называете "эффективным") способ сделать это, вероятно, примерно так:
void char2bits1(unsigned char c, unsigned char * bits) {
int i;
for(i=sizeof(unsigned char)*8; i; c>>=1) bits[--i] = c&1;
}
Функция принимает символ для преобразования в качестве первого аргумента и заполняет массив bits
соответствующим битовым шаблоном. На моем ноутбуке он работает за 2,6 нс. Он предполагает 8-битные байты, но не сколько байтов имеет длина char, и не требует, чтобы входной массив был предварительно инициализирован нулем.
Я не ожидал, что это будет самый быстрый подход. Моя первая попытка выглядела так:
void char2bits2(unsigned char c, unsigned char * bits) {
for(;c;++bits,c>>=1) *bits = c&1;
}
Я думал, что это будет быстрее, если избежать поиска в массиве, зациклившись в естественном порядке (за счет производства битов в порядке, обратном запрошенному), и остановившись, как только c станет равным нулю (так что массив битов будет должны быть инициализированы нулем перед вызовом функции). Но, к моему удивлению, эта версия имела время работы 5,2 нс, что вдвое больше, чем у версии выше.
Исследование соответствующей сборки показало, что разница заключалась в разворачивании петли, которая выполнялась в первом случае, но не во втором. Это иллюстрация того, как современные компиляторы и современные процессоры часто обладают удивительными характеристиками производительности.
Изменить: если вы действительно хотите, чтобы символы без знака в результате были символами '0'
и '1'
, используйте эту измененную версию:
void char2bits3(unsigned char c, unsigned char * bits) {
int i;
for(i=sizeof(unsigned char)*8; i; c>>=1) bits[--i] = '0'+(c&1);
}
person
amaurea
schedule
27.11.2014
ch & (1 << n)
, чтобы выбрать бит, а затем соответственно установите значения в вашем массиве - person M.M   schedule 27.11.2014