shellcript中2的补充

时间:2017-12-16 19:47:46

标签: bash binary twos-complement

我正在尝试在Shellscript(Bash)中创建一个简单的程序来计算2的补码二进制数。

作为测试,我只使用8位二进制值(00000100),但我一直在接受#34; Bad Substitution"错误,我不明白为什么。

  #!/bin/bash
binary=00000100
firstBit=${binary:0:1}
secondBit=${binary:1:1}
thirdBit=${binary:2:1}
fourthBit=${binary:3:1}
fifthBit=${binary:4:1}
sixthBit=${binary:5:1}
seventhBit=${binary:6:1}
eighthBit=${binary:7:1}
binaryNew=""
if [[ $firstBit == "1" ]]
then
binaryNew=0
if [[ $secondBit == "1" ]]
then
binaryNew+=0
else 
binaryNew+=1
if [[ $thirdBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $fourthBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $fifthBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $sixthBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $seventhBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $eighthBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
fi
fi
fi
fi
fi
fi
fi
fi
echo $binaryNew=

任何帮助都将不胜感激。

由于

5 个答案:

答案 0 :(得分:4)

要对8位二进制值进行二进制补码:

$ binary=00000100
$ x=$((2#$binary))
$ [ "$x" -gt 127 ] && ((x=x-256)); echo "$x"
4

注释

  1. 表达式$((2#$binary))执行从二进制到十进制的转换。

  2. 命令[ "$x" -gt 127 ] && ((x=x-256))在8位值上执行两个补码。

答案 1 :(得分:2)

如果要迭代某个值,请使用循环而不是为每个位置定义变量:

#! /bin/bash

binary=0100
for ((pos=0 ; pos < ${#binary} ; pos++ )) ; do
    if (( ${binary:$pos:1} )) ; then
        complement+=0
    else
        complement+=1
    fi
done
echo $complement

答案 2 :(得分:2)

我将回答如何在bash中计算2的补码。 相反,我会回答为什么OP获得“不良替代”的原因。错误。

请注意shebang之前的两个空格:

  #!/bin/bash

由于这些原因,它并没有被解释为一个shebang,而是一个通常用两个空格缩进的注释行。

因此,脚本不是由bash执行的,而是由用户的默认shell执行的,在OP的情况下,它很可能是/bin/sh或者符号链接到的任何内容

您可以确定用户使用的shell默认为建议的here

getent passwd $LOGNAME | cut -d: -f7

答案 3 :(得分:1)

对于bash中的算术运算使用双括号(( .. )),否则如果变量声明为整数,则可以执行某些操作。

typeset -i binaryNew
binaryNew+=1

((binaryNew+=1))

bash算术只能从2到62之间的基数转换为基数10,例如

i=$((2#10101))
echo "$i"

答案 4 :(得分:1)

使用bash,tr和bc:

#!/bin/bash

binary=00000100

# Ones' complement, result decimal
c1=$(tr 01 10 <<< $binary)

# Two's complement, result decimal
c2=$((2#$c1+1))

# convert decimal to binary
echo "obase=2; $c2" | bc

输出:

11111100