shell脚本中的2补码

问题描述 投票:3回答:5

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

作为测试,我只使用8位二进制值(00000100),但我不断收到“错误替换”错误,我不明白为什么。

  #!/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=

任何帮助,将不胜感激。

谢谢

bash binary twos-complement
5个回答
4
投票

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

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

Notes

  1. 表达式$((2#$binary))确实从二进制转换为十进制。
  2. 命令[ "$x" -gt 127 ] && ((x=x-256))对8位值执行二进制补码。

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
投票

我不会回答如何在bash中计算2的补码。相反,我会回答为什么OP得到'坏替换'错误。

注意shebang之前的两个空格:

  #!/bin/bash

因为这些,它不被解释为shebang,而是作为通常用两个空格缩进的注释行。

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

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

getent passwd $LOGNAME | cut -d: -f7

1
投票

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

((

要么

))

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

typeset -i binaryNew
binaryNew+=1

1
投票

使用bash,tr和bc:

((binaryNew+=1))

输出:

11111100
© www.soinside.com 2019 - 2024. All rights reserved.