Я пишу функцию для обработки входящего 32-битного буфера, представляющую изменяющиеся данные при сравнении с соответствующим сохраненным 32-битным буфером. Позиция изменяющегося бита представляет собой число (т. е. значение 8 означает бит 3), которое необходимо обработать, а также является ли изменение 0->1 или 1->0. Вот текущая реализация, пожалуйста, помогите мне улучшить ее! Обратите внимание, что это не настоящий код, он был упрощен, чтобы не зависеть от контекста.
uint32_t temp = oldBuffer ^ newBuffer;
uint32_t number = 0;
while (temp != 0)
{
if (temp & 0x1)
{
uint32_t bitValue = 0;
if ((newBuffer& (1 << number)) != 0) bitValue = 1;
processNumber(number, bitValue);
}
number++;
temp = temp >> 1;
}
oldBuffer = newBuffer;
Прямо сейчас это работает, но мне не нравится, что он должен проверять каждый бит, проверяя бит 1 и переключаясь через все это. Если бы была гарантирована установка только 1 бита, это было бы несложно понять, но это не так.
Редактировать: Нейлу, я думаю, я надеюсь найти способ получить позиции битов после XOR за постоянное время, вместо того, чтобы сдвигать весь буфер и проверять биты один за другим.