在一行而不是逐行转换 Twos 补码结果,怎么样?

Convert Twos complement results on one line rather than line by line, how?

我正在使用下面的代码获取值并将它们转换为二进制补码。我已经尝试过 twos FF & twos FE。我怎样才能把它放在一个字符串中,以便结果返回 -1、-2 而不是逐行返回?

twos() { x=$((16#)); [ "$x" -gt 128 ] && ((x=x-256)); echo "$x"; }

现在:

$ twos FF
-1
$ twos FE
-2
 $ twos 01
1

正如@choroba 评论的那样, 已经(几乎)提供了您需要的代码。

我还在回答这个问题,因为这个问题实际上包含两个问题,即计算补码并多次计算。如果把这两个问题分开而不是重复代码,你也可以用同样的方法多次做其他的计算:

# execute a command for each argument provided,
# concatenating output with ", " 
#  ....... command
#  - $n .. command arguments
multi() {
    cmd=""
    shift
    for arg in $@
    do
        "$cmd" "$arg"
    done | xargs | sed 's/ /, /g'
}

用法:

multi twos FF FE AB 01
-1, -2, -85, 1

正在更新我的 以添加逗号,让我们创建函数:

$ twosx() (c=; for x in "$@"; do x=$((16#$x)); [ "$x" -gt 127 ] && ((x=x-256)); printf "%s%s" "$c" "$x"; c=", "; done; echo ""; )

使用示例:

$ twosx 00
0
$ twosx 00 01 7F 80 FE FF
0, 1, 127, -128, -2, -1