在 shell 脚本中将值转换为“二进制数”

6 shell bash

我知道公元前:

$> var="304"
$> echo "obase=2; $var" | bc
100110000
Run Code Online (Sandbox Code Playgroud)

可以在shell中完成吗(没有外部调用)?

这个问题: Binary to hexadecimal and decimal in a shell script 询问如何从二进制转换,而不是转换为二进制数。

那里的答案使用 xxd 或其他一些外部工具处理二进制字节(与二进制数相反,即:基数为 2 的数字)。所以,不,这个问题不是那个的重复。

jim*_*mij 8

perl是完成这项工作的好工具:

$ var="304"
$ perl -e 'printf "%b\n",'$var
100110000
Run Code Online (Sandbox Code Playgroud)


小智 7

在 bash 中:

toBinary(){
    local n bits sign=''
    (($1<0)) && sign=-
    for (( n=$sign$1 ; n>0 ; n >>= 1 )); do bits=$((n&1))$bits; done
    printf "%s\n" "$sign${bits-0}"
}
Run Code Online (Sandbox Code Playgroud)

用:

$> toBinary 304
100110000
Run Code Online (Sandbox Code Playgroud)

或更多 POSIX_ly:

toBinaryPOSIX(){
    n=$(($1))
    bits=""
    sign=""
    if [ "$n" -lt 0 ]; then
        sign=- n=$((-n))
    fi
    while [ "$n" -gt 0 ]; do
        bits="$(( n&1 ))$bits";
        : $(( n >>= 1 ))
    done
    printf "%s\n" "$sign${bits:-0}"
}
Run Code Online (Sandbox Code Playgroud)

用:

$> toBinaryPOSIX 304
100110000
Run Code Online (Sandbox Code Playgroud)

如果值为十六进制:

$> toBinaryPOSIX 0x63
1100011
Run Code Online (Sandbox Code Playgroud)