私は紀元前を知っています:
$> var="304"
$> echo "obase=2; $var" | bc
100110000
(外部呼び出しなしで)シェルで実行できますか?
この問題: シェルスクリプトで2進数を16進数と10進数に変換する バイナリをバイナリに変換する方法を尋ねます。
それに対する答えは、xxdを使用してバイナリバイト(バイナリ、つまり2進数の数字とは反対)を処理するか、または他の外部ツールを使用します。いいえ、この質問はこの質問と重複しません。
答え1
perl
仕事のための素晴らしいツールです。
$ var="304"
$ perl -e 'printf "%b\n",'$var
100110000
答え2
バッシュから:
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}"
}
使用:
$> toBinary 304
100110000
またはそれ以上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}"
}
使用:
$> toBinaryPOSIX 304
100110000
値が16進数の場合:
$> toBinaryPOSIX 0x63
1100011
答え3
次のソリューションでは、組み込み関数を使用して数値をバイナリ形式に変換します。
#! /bin/sh
E=[24680] # even nums
O=[13579] # odd nums
lookuptbl() {
case $1 in
$E[01]* ) echo 0 ;; $E[23]* ) echo 1 ;;
$E[45]* ) echo 2 ;; $E[67]* ) echo 3 ;;
$E[89]* ) echo 4 ;; $O[01]* ) echo 5 ;;
$O[23]* ) echo 6 ;; $O[45]* ) echo 7 ;;
$O[67]* ) echo 8 ;; $O[89]* ) echo 9 ;;
esac
}
divby2() {
set -- "0$1"
while case $1 in ? ) break ;; esac; do
set -- "${1#?}" "${2-}$(lookuptbl "$1")"
done
echo $2
}
dec2bin() {
case $1 in *[!0]* ) :;; * ) echo 0; return ;; esac
while :
do
case $1 in *[!0]* ) :;; * ) break;; esac
case $1 in
*$E ) set -- "$(divby2 "$1")" "0${2-}" ;;
*$O ) set -- "$(divby2 "$1")" "1${2-}" ;;
esac
done
echo "$2"
}
# And then... (assuming pure number given from command line)
num=${1:-304}
dec2bin "$num"
結果
100110000
答え4
POSIX awkが利用可能標準ライブラリ:
$ awklib 'BEGIN {print base_conv(304, 10, 2)}'
100110000
または:
$ awklib 'BEGIN {print base_conv(ARGV[1], 10, 2)}' 304
100110000