결과

결과

나는 기원전을 안다:

$> 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

관련 정보