bcメモ。

コンソール用電卓が欲しくなってきたので、bcを試してみた。

はじめてのbc

% bc -q
1 + 2
3
obase = 2
2 ^ 10
10000000000
ibace = 8
755
1011110011
quit
  • ibase,obaseで基数の変更が出来る。

manのサンプルが凄いっす。電卓の域を遥かに越えてる・・・。

2進数ダンプ

昨日の2進ダンプもワンライナで。

% cat 123.txt
123
456
789
% (echo 'obase = 2' && cat 123.txt) | bc
1111011
111001000
1100010101

いい感じ。

シェルスクリプトにしとこう。

22() { (echo 'obase = 2' && cat -) | bc }

「to 2進数」なので「22」。適当。

% cat 123.txt | 22
1111011
111001000
1100010101

123を2進数にすると1111011

dc

逆ポーランド電卓もあった。

% dc
1 2 + 3 4 + * p
21
q

変態度を極めるなら、dcです。

イマイチな点

  • 0xFFとか0755とかは受け付けない。
  • ビット演算子が無い。

う〜ん。

Rubyで基数変換

こういう時はRubyの出番。

% echo '0x123' | ruby -e 'STDIN.each{|l| printf "%b\n", l.to_i(0)}'
100100011

メモ。

  • "0x123".to_i(0)で、基数の自動判別が効くようになる。
  • printf "%b"で2進数表示。

22コマンドを書き直す。

22() { ruby -e 'STDIN.each{|l| printf "%b\n", l.to_i(0)}' }
% echo '0x123' | 22
100100011

やっぱりRubyダネ。

Vimで電卓

+rubyvimならRubyを電卓に出来る。

:command! -nargs=+ Calc :ruby print <args>
:ruby include Math
:Calc 1 + 2
3
:Calc sin(PI / 2)
1.0

やばすぎ。

Rubyの電卓が激しく便利なので

rcコマンドを作ってみた。

rc() { ruby -e 'include Math;STDIN.each{|l| puts eval(l)}' }

Ruby電卓の威力。

% rc
1 + 2
3
1 << 10
1024
sin(PI/2)
1.0
sprintf "%b", 0755
111101101
sprintf "%o", 0755 & ~0111
644
exit

・・・強力杉。

まとめ

コマンドライン電卓の選択肢はいろいろある。

こんな感じかな。

参考