Меня попросили в интервью следующий вопрос.
int countSetBits(void *ptr, int start, int end);
Описание:
Предположим, что ptr
указывает на большой кусок памяти. Просмотр этой памяти как непрерывной последовательности бит, start
и end
являются битовыми позициями. Предположим, что start
и end
имеют правильные значения, а ptr
указывает на инициализированный фрагмент памяти.
Вопрос:
Напишите код C, чтобы подсчитать количество бит с start
до end
[включительно] и вернуть счет.
Просто, чтобы сделать его более понятным
ptr---->+-------------------------------+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+-------------------------------+
| 8 | 9 | |15 |
+-------------------------------+
| |
+-------------------------------+
...
...
+-------------------------------+
| | S | |
+-------------------------------+
...
...
+-------------------------------+
| | E | |
+-------------------------------+
...
...
Мое решение:
int countSetBits(void *ptr, int start, int end )
{
int count = 0, idx;
char *ch;
for (idx = start; idx <= end; idx++)
{ ch = ptr + (idx/8);
if((128 >> (idx%8)) & (*ch))
{
count++;
}
}
return count;
}
Я дал очень длинный и несколько неэффективный код во время интервью. Я работал над этим позже и придумал решение выше.
Я очень уверен, что сообщество SO может предоставить более элегантное решение. Мне просто любопытно увидеть их ответ.
PS: выше код не скомпилирован. Это больше похоже на псевдокод и может содержать ошибки.