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
- 表达式
$((2#$binary))
确实从二进制转换为十进制。 - 命令
[ "$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补码的主要内容,如果未能解决你的问题,请参考以下文章