Vimで10進数を2進数に変換する


アニメ『刻刻』

OPかっこいいです。私の中の順位では、大江戸捜査網のOPの次ぐらいにカッコいいです。
時を止める話って、止めたり動かしたりして、周囲を驚かせるってのが定石かと思ってたんですが、このアニメは、なんと止まりっぱなしなんです。なのに面白い。時が止まってる世界ではルールがあって守らないと大変なことになったり、普通ではない能力が使えたりします。時を止めるのに使ってるのが、家宝?の石。これを巡って争いが続きます。私も欲しいですこの石。

Vimもかなりのお宝だと思いますが、誰でも見れるので争いにはなりませんね。
Vimのヘルプにも結構なお宝が眠っています。

takk@deb9:~$ vim

Vimが起動したら、

:h eval-examples

すると、こんなサンプルスクリプトが表示されます。

:" The function Nr2Bin() returns the binary string representation of a number.
:func Nr2Bin(nr)
:  let n = a:nr
:  let r = ""
:  while n
:    let r = '01'[n % 2] . r
:    let n = n / 2
:  endwhile
:  return r
:endfunc

:" The function String2Bin() converts each character in a string to a
:" binary string, separated with dashes.
:func String2Bin(str)
:  let out = ''
:  for ix in range(strlen(a:str))
:    let out = out . '-' . Nr2Bin(char2nr(a:str[ix]))
:  endfor
:  return out[1:]
:endfunc

いやあ、面白い上に賢いプログラムだなあと思います。

でも私はずっと下のようなスクリプトを使ってます。

takk@deb9:~$ cat dec2bin.vim
:function! Dec2bin()
:       let n=str2nr(getline("."),10)
:       call setline(".",printf("%x",n))
:       s/0/0000/ge
:       s/1/0001/ge
:       s/2/0010/ge
:       s/3/0011/ge
:       s/4/0100/ge
:       s/5/0101/ge
:       s/6/0110/ge
:       s/7/0111/ge
:       s/8/1000/ge
:       s/9/1001/ge
:       s/a/1010/ge
:       s/b/1011/ge
:       s/c/1100/ge
:       s/d/1101/ge
:       s/e/1110/ge
:       s/f/1111/ge
:endfunction
:map <f3> :call Dec2bin()<CR>
takk@deb9:~$
takk@deb9:~$ seq 30 35 | vi -

としてVimを開くと、このようなテキストが表示されますので、

30
31
32
33
34
35

:so dec2binを実行してから、
ggVGで、全選択して、 F3キーを押すと、

00011110
00011111
00100000
00100001
00100010
00100011

バイナリに変換されます。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA