Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 在一个数字中计数1';s二进制表示_Shell_Sh - Fatal编程技术网

Shell 在一个数字中计数1';s二进制表示

Shell 在一个数字中计数1';s二进制表示,shell,sh,Shell,Sh,我已经想出了一种方法,用c程序计算给定数字中的设置位数。计划如下: unsigned int countSetBits(unsigned int n) { unsigned int count = 0; while (n) { count += n & 1; n >>= 1; } return count;

我已经想出了一种方法,用c程序计算给定数字中的设置位数。计划如下:

    unsigned int countSetBits(unsigned int n) 
    { 
        unsigned int count = 0; 
        while (n)
        { 
            count += n & 1; 
            n >>= 1; 
        } 
        return count; 
     } 
现在我正在尝试在shell脚本中实现相同的功能,但在其中一行中遇到了问题

    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)只有一个位集)。由于我对shell脚本不熟悉,期待您的帮助

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"

非常感谢oguz ismail,你能给我推荐一些好的材料来掌握这些与函数相关的概念吗?wrt shell脚本。
$(count…)
调用一个名为
count
的程序。整个
$(..)
表达式将被
count
程序的输出替换。此外,
$((var&1))
在POSIX shell和Bourne shell中都无效。您必须使用类似于
bc
,或者切换到支持算术计算的shell,例如Ksh、Zsh或bash。@user1934428
$((表达式))
语法是的一部分,以及
&
运算符。我应该检查它。我在
ash
上试用了它,我认为它是实现该标准的一个工具,但在那里不起作用。事实上,在
dash中它确实起作用。然而,OP也用sh标记了这个问题,根据SO的说法,sh指的是旧的UnixV7BourneShell。因此,带此标签的问题应该在Bourne和POSIC上得到答案。打败我吧,但我认为这种构造在当时(旧Unix时代)已经不存在了。当然,我不知道OP为什么对如此古老的shell感兴趣……@user1934428标记描述说,从Unix版本7开始;sh是标准而不是特定的外壳;在大多数系统上,它是指向bash、dash、ksh或mksh的链接。POSIX只记录了广泛实现的特性/行为/实践。