Беззнаковое короткое деление для двоичного представления в C

#c #bit-manipulation

#c #битовая манипуляция

Вопрос:

Итак, я пытаюсь выполнить целочисленное деление для двоичного представления беззнакового короткого. Например: Допустим, что беззнаковое короткое x = 5, представление двоичного числа равно
1111. 7 будет равно 111. Я хочу иметь возможность находить количество пар битового представления 1. Моя идея состояла в том, чтобы подсчитать количество единиц, используя битовую манипуляцию следующим образом.

 unsigned short divide(unsigned short input) {
    unsigned short count = 0;
    while (input != 0){
        if ((input amp; 1) == 1)
            count = count   1;
        input = input >> 1;
    }
    return count;
} 
  

Приведенный выше код работает для получения общего числа в 1 бит в двоичном представлении. Пример: в моей версии 7 оно возвращало бы 3, поскольку в двоичном представлении 3 1. Теперь я просто хочу иметь возможность выполнять целочисленное деление, такое как 3/2 = 1, чтобы найти количество пар 1. 3/2 для беззнакового сокращения будет равно 1, поскольку существует только 1 пара битов 1. если для 5, это было бы 4/2 = 2,2 пары. Как бы я поступил с точки зрения реализации целочисленного деления без использования арифметических операций, таких как модуль, ,-, *, /.

Комментарии:

1. Я думаю, вы имели в виду x=15 вместо x=5 для первого примера.

2. Деление на степень 2 аналогично сдвигу вправо, когда делимое является целым числом без знака.

3. x/pow(2,y) равно x>>y

4. only 1 pair of 1's bits — насколько я понимаю, ваш алгоритм завершится неудачей для 10101 . — не имеет пар битов 1, вы будете считать 1 пару (3/2 = 1).