【问题标题】:Twos complement of decimal number十进制数的二进制补码
【发布时间】:2015-05-05 11:01:50
【问题描述】:

我想使用 shell 查找十进制数的二进制补码。 谁能帮帮我?

【问题讨论】:

  • 你有没有试过自己解决这个问题?如果是这样,您遇到了什么问题?请edit您的问题向我们展示。这似乎与your previous question 有关

标签: shell decimal twos-complement


【解决方案1】:

二进制补码以二进制形式工作,因此根据您的数字的位数,您可以处理十进制数字,例如:

if number >= pow(2, N - 1)
    return number
else
    return number - pow(2, N)

示例:

N = 3
number = 2
number is less than pow(2, 3 - 1) = 4, so result = number = 2

N = 3
number = 6
number is greater than pow(2, 3 - 1) = 4, so result = number - pow(2, 4) = 6 - 8 = -2

我的想法来自Wikipedia

重击

#!/bin/bash

NUMBER="$1"
BITS="$2"

# I check the presence of the arguments
if [ -z "$NUMBER" -o -z "$BITS" ]; then
    echo "Usage: $0 <number> <n_bits>"
    exit
fi

# I check the arguments are numeric values
RE='^[0-9]+$'
if ! [[ $NUMBER =~ $RE ]] || ! [[ $BITS =~ $RE ]] ; then
    echo "The inputs must be numeric values"
    exit
fi

# Calculate, with awk, the powers I need
N_POW=$(awk "BEGIN{ print 2 ** $BITS }")
NM1_POW=$(awk "BEGIN{ print 2 ** ($BITS - 1) }")

# Result...
if [ $NUMBER -lt $NM1_POW ];
then
    echo $NUMBER
else
    echo $(($NUMBER - $N_POW))
fi

【讨论】:

  • 这并没有真正解决使用shell部分的问题。
  • 将其粘贴到 my_script.sh 文件中并在 shell 中运行 sh my_script.sh
【解决方案2】:

你可以试试 bc:

dec=-4; bits=6;
bin=$(printf "%0.${bits}d\n" $(echo "ibase=10;obase=2;$(((2**(bits))+$dec))" | bc) )
bin=$(echo $bin | grep -oE "[[:digit:]]{$bits}$")
echo $bin
111100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 2014-12-25
    • 1970-01-01
    • 2018-12-14
    • 2017-03-16
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多