Comment detail

LL Golf Hole 6 - 10進数を2進数に基数変換する (Nested Flatten)

pure bash。引数。2進数のみ。

bashのprintfだと%bが使えないようなので、8進数経由で。

1
2
3
4
5
6
a=(000 001 010 011 0100 0101 110 111)
n=`printf '%o\n' $1`
while [ "$n" != '' ];do
  echo -n ${a[${n:0:1}]}
  n=${n:1}
done
楽をするならこんなのはどうでしょう。

  e.g.
    $ echo "obase=2; 255" | bc
    11111111

# AIX 4.3.3.0, HP-UX B.11.00, Linux 2.4.2, SunOS 5.5.1で動作を確認。
どのシステムでも動くようにするなら、Bourne shellで愚直に。

  e.g.
    $ dec2bin() {
      d=$1
      t=''
    
      [ $# -eq 0 ] && return 1
    
      while [ $d -gt 0 ]; do
        r=`expr $d % 2`
        d=`expr $d / 2`
        t="$r$t"
      done
    
      echo "${t:=0}"
    
      return 0
    } && dec2bin 255

# AIX 4.3.3.0, HP-UX B.11.00, Linux 2.4.2, SunOS 5.5.1で動作を確認。

なるほど。

で、POSIX Shell規格でしたらexprを呼ばずにいけるので、ちょっとだけ改造してみました。

1
2
3
4
5
d=$1
while [ $d -gt 0 ];do
  echo -n $(($d%2))
  d=$(($d/2))
done

間違い、桁が逆でした。

1
2
3
4
5
6
d=$1
while [ $d != 0 ];do
  t=$(($d%2))$t
  d=$(($d/2))
done
echo $t

Index

Feed

Other

Link

Pathtraq

loading...