在一行而不是逐行转换 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
我正在使用下面的代码获取值并将它们转换为二进制补码。我已经尝试过 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