Integer.parseIntによる負の2進数解析

Javaで2進数文字列をint値にしたいと思ったら、Integer#parseInt(s, 2) をすればよいのだろうな

public class Test {
    public static void main(String[] args) {
        String s = "10000000000000000000000000000000";    // 32 length characters
        int i = Integer.parseInt(s, 2);    // NumberFormatException
    }
}
public class Test {
    public static void main(String[] args) {
        String s = "-10000000000000000000000000000000";    // 33 length characters
        int i = Integer.parseInt(s, 2);
        System.out.println(Integer.MIN_VALUE == i);    // true
    }
}

たいしたもんだ

【参考】
http://stackoverflow.com/questions/8888946/converting-32-bit-binary-string-with-integer-parseint-fails

こんなやり方は間違えるに決まっている

間違えない方がおかしい

やや面倒だが、以下の自前実装の方がいくぶんマシに思える

public class Test {
    public static void main(String[] args) {
        String s = "10000000000000000000000000000000";
        int i = bin2Int(s);
        System.out.println(Integer.MIN_VALUE == i);    // true
    }

    private static int bin2Int(String s) {
        if (32 < s.length() || 0 == s.length()) {
            throw new NumberFormatException();
        }

        int i = 0;

        for (char c : s.toCharArray()) {
            i <<= 1;

            switch (c) {
            case '0':
                break;

            case '1':
                i |= 1;
                break;

            default:
                throw new NumberFormatException();
            }
        }

        return i;
    }
}