Это простой вопрос, но то, как вы его сформулировали, пугает меня:)
Давайте сначала попробуем сделать это для пар 1
с (вы поймете почему) для 32 бит:
unsigned count_pairs_1(unsigned n){
n = n & ( n >> 1); // bit N will be set if bits N and N+1 were set
n &= 0x55555555; // we need just those on even position, so ANDing with 0b01..0101
return count_set_bits(n); // now we need the number of 1 bits in the result
};
Все, что нам сейчас нужно, это count_set_bits(unsigned)
, это очень известная функция: http://www -graphics.stanford.edu / ~ seander / bithacks.html # CountBitsSetTable
Для подсчета нулевых битов используйте count_pairs(~n)
или
unsigned count_pairs_0(unsigned n){
n = n | ( n >> 1); // bit N will be zero iff bits N and N+1 were zero
n |= 0xAAAAAAAA; // all odd bits are set
return 32 - count_set_bits(n); // every remaining zero bit corresponds to zero pair in the input
};
РЕДАКТИРОВАТЬ: только что заметил замечание Учитывая 64-битное число ... Дополнительное заполнение нулями после MSB следует игнорировать . После чего MSB? Вы имеете в виду, что вход является байтом? или слово?