shell脚本中的2补码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本中的2补码相关的知识,希望对你有一定的参考价值。

我试图在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=

任何帮助,将不胜感激。

谢谢

答案

要对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位值执行二进制补码。
另一答案

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

#! /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
另一答案

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

注意shebang之前的两个空格:

  #!/bin/bash

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

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

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

getent passwd $LOGNAME | cut -d: -f7
另一答案

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

((

要么

))

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

typeset -i binaryNew
binaryNew+=1
另一答案

使用bash,tr和bc:

((binaryNew+=1))

输出:

11111100

以上是关于shell脚本中的2补码的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse 中的通用代码片段或模板

shell 脚本 片段

用于确保在任何给定时间仅运行一个 shell 脚本的 shell 片段 [重复]

常用python日期日志获取内容循环的代码片段

shell脚本引用expect

Python如何调用别人写好的脚本