その時々

その時々で違うんです。特に決まっていないんです。

プログラミングドリル 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になるまで繰り返していけばいいのです。