2016年8月16日火曜日

数字の桁数を取得する方法(2進数ver)

前回紹介した「 数字の桁数を取得する方法」で
2進数表記時の桁数取得方法について触れてなかったので、改めて書いてく
基本的には2進数でもやり方は同じだ


 数字を文字列に変換して「文字数=桁数」で求める方法
Javaの場合、Integer.toBinaryString()メソッドで数字を二進数にして文字列取得できる
// num = 365を文字列に変換し、文字数から桁数を求める
int num = 365;
int length = Integer.toBinaryString(num).length();
System.out.println(num + "の桁数は" + length);


 常用対数を利用して求める方法
前回の公式を利用して、2進数バージョンを作ればOK
こんな感じになる \[ n =\lfloor {\log_{2} x} \rfloor + 1 \] ここで問題。。。 javaには基底が「2」の対数が用意されていない!!
そこで基底の変換公式を使う \[ \log_{n} x= \dfrac{\log_{m} x}{\log_{m} n} \] よって、数式はこんな感じ \[ n =\lfloor {\log_{2} x} \rfloor + 1 = \lfloor {\dfrac{\log_{e} x}{\log_{e} 2}} \rfloor + 1 \] プログラムで書くと
// num = 365を常用対数から桁数を求める
int num = 365;
int length = (int) (Math.log(num) / Math.log(2)) + 1;
System.out.println(num + "の桁数は" + length);

 まとめ
2進数表記での桁取得は圧倒的に「常用対数を利用する方法」がいいだろう

前者の場合、完全にAPI依存になる。2進数表記文字列の出力がない言語では使えない
C言語での出力フォーマット指定子に2進数はない(8進、16進はあるのに..)
そのため、Cではほかの出力方法をとらないといけない (C++なら「itoa()」とか)
ただ桁数知りたいだけなのに、これ以上手間をかけるのは面倒...

後者の場合、
どの言語でもMathパッケージ、Math.hに当るものがあるはずなので、APIの心配はない
プログラムの分母になる「Math.log(2)」の数値を変えるだけで何進数にも対応できる利点もある

まぁあまんまり使う機会ないだろうけどw

0 件のコメント:

コメントを投稿