Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2914

Bashだけで10進数からn進数(2~64進数)に変換する

$
0
0

はじめに

10進数からn進数(2~64進数)に変換するBashスクリプトの関数です。今回は引数チェックも入れました。Bash 4.4.12で動作を確認しています。
参考記事→Bashだけで16進数・10進数・2進数間の相互変換を行う

コード

conv_digit.sh
# Usage: conv_digit 17 2 # -> 10001# Usage: conv_digit 31 16 # -> 1ffunction conv_digit(){local natural digit quotient surplus sign c64 result
  c64='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@_'[[!$1]]&&return
  if[[!$1=~ ^[+\-]?[0-9]+$ ]]then
    echo"${FUNCNAME[0]}($1,$2): Arg 1 is invalid. call from ${FUNCNAME[1]}():${BASH_LINENO[0]}">&2
    return-1fi[[$1-lt 0 ]]&&{natural=-$1;sign=-;}||natural=$1if[[$2]]then
    if[[!$2=~ ^[0-9]+$ ||$2-lt 2 ||$2-gt 64 ]]then
      echo"${FUNCNAME[0]}($1,$2): Arg 2 is invalid. call from ${FUNCNAME[1]}():${BASH_LINENO[0]}">&2
      return-1else
      digit=$2fi
  else
    digit=10
  fi
  echo-n$signwhile :
  do
    surplus=$(($natural%$digit))natural=$(($natural/$digit))result=${c64:$surplus:1}$result[[$natural-eq 0 ]]&&break
  done
  echo$result}

使い方

$ conv_digit 17 2
10001
$ conv_digit 31 16
1f
$ conv_digit 31
31

n進数から10進数にするにはBashの組み込み機能で行なえます。

$ echo$((16#1f))
31
$ echo$((16#$(conv_digit 31 16)))31

補足

第一引数は変換する10進数自然数のつもりでしたが、先頭に0がつく数字は8進数として、先頭にマイナス記号(-)がつく数字は負の数として認識されるようですが、完全には動作を確認していません。小数は扱えません。
なお第二引数は進数を指定しますが、指定しない場合は10として扱われます。負の値や小数はエラーになります・

諸注意

コードはご自由に使って頂いて構いませんが、一切の保証はいたしません。


Viewing all articles
Browse latest Browse all 2914

Trending Articles