プログラミングドリル No.1の解答例
問題の解答例です。
python
まずはPythonで作成してみました。
2to10.py
import sys argvs = sys.argv argc = len(argvs) if argc != 2: print 'Usage: # python %s binary' % argvs[0] quit() print 'result: %s' % int(argvs[1], 2)
実行例
$ python 2to10.py 10101111 result: 175
すごく簡単に出来ました。
Java
続いてJavaです。
BinaryToDecimal.java
class BinaryToDecimal { public static void main(String[] args) { long decimal; decimal = Long.parseLong(args[0], 2); System.out.println("result:" + decimal); } }
実行例
$ java BinaryToDecimal 10101111 result:175
これだと64bitまでしか対応していないため、それ以上の場合は次の
BigIntegerを使用すると対応するようです。
Twitterで教えてもらいました。
BinaryToDecimal2.java
import java.math.*; class BinaryToDecimal2 { public static void main(String[] args) { BigInteger decimal; decimal = new BigInteger(args[0], 2); System.out.println("result:" + decimal); } }
JavaScript
次はJavaScriptです。
<script> i = parseInt("10101111", 2); document.write("result:" + i); </script>
実行例
result:175
JavaScriptは64bitフルに1を立てると最後のほうが打ち切られてしまいます。
LISP
ここで使うLispはCommonLispです。処理系はSBCLで行きます。
2to10.lisp
(defun second-args () (let* (b-num) (setq b-num (or (second *posix-argv*) "0")))) (format t "result: ~d~%" (parse-integer (second-args) :radix 2))
実行例
$ sbcl --script 2to10.fasl 10101111 result:175
C
最後にC言語です。
とりあえずこの5つの言語を勉強がてら、やっていきたいと思います。
2to10.c
#include <stdio.h> #include <stdlib.h> int main(int argc, char *args[]) { unsigned long long data; data = strtoll(args[1],NULL,2); printf("result: %llu\n",data); return 0; }
実行例
$ ./2to10 10101111 result: 175
この場合の最大値は約9京ですね。
疑似コード
while x > 2{ answer = x mod 2 + answer x /= 2 } answer = x mod 2 + answer
10進数を2進数にするには、10進数を2で割った余りを求めて商が0か1になるまで繰り返していけばいいのです。