считать 1 в двоичном представлении числа

Я нашел способ рассчитать количество установленных бит в заданном числе, используя программу переменного тока. Программа как ниже:

    unsigned int countSetBits(unsigned int n) 
    { 
        unsigned int count = 0; 
        while (n)
        { 
            count += n & 1; 
            n >>= 1; 
        } 
        return count; 
     } 

Теперь я пытаюсь реализовать то же самое в сценарии оболочки, но сталкиваюсь с проблемой в одной из строк

    count=0
    var=128

    while [ $var -gt 0 ]    
    do
            count=$(count + $((var&1))) // throws command not found on console
            var=$((var >> 1))
    done
    echo $count

Здесь мы пытаемся напечатать число установленных битов в переменной var (128) (ожидая, что на выходе 1 bcz 128 (10000000) будет установлен только один бит). Ждем вашей помощи, поскольку я новичок в сценарии оболочки.

Всего 1 ответ


count=$(count + $((var&1)))

Вам не нужно вкладывать арифметические расширения. И строка выше должна выглядеть так:

count=$((count+(var&1)))

Я бы написал это так:

cnt=0 var=128
while [ "$var" -gt 0 ]; do
  : $((cnt+=var&1, var>>=1))
done
echo "$cnt"

Есть идеи?

10000