(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

java的排他的論理和とか2進数変換とか。

最近Javaが楽しいのです。変態です。

以下のようなプログラムを書いた場合の出力は何かという話。

public class Sample {
    public static void main(String[] args) {
        System.out.println(3 ^ 'B');
    }
}

答えは65なんですけども。

Javaをある程度勉強していれば、65になるのは当然だと思うんですが、つまりint値である3にキャストされてchar型であるBがintへと変換されて3^66=65になっただけの話です。

もし、明示的に書くのであれば

public class Sample {
    public static void main(String[] args) {
        System.out.println(3 ^ (int)'B');
    }
}

このようになるのだけど、Javaの暗黙的な型変換怖いですね。

まぁココで3と66の排他的論理和というのが気になって、Javaで2進数ってどうやって出力できたっけということでやってみた。

public class Sample {
    public static void main(String[] args) {
        System.out.println(3 ^ 'B');
        int a = Integer.parseInt(Integer.toBinaryString(3));
        int b = Integer.parseInt(Integer.toBinaryString('B'));
        String c = String.valueOf(a);
        String d = String.valueOf(b);
        String e = String.valueOf(a^b);
        String f = String.valueOf(Integer.parseInt(e,2));
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        System.out.println(e);
        System.out.println(f);
    }
}

Integerクラスに2進数変換用のメソッドであるtoBinaryStringというものが用意されていて、もともとStringを返すのでparseIntしてintの変数に代入している。

なので

3→11
'B'→1000010

なのである。これの排他的論理和なんで

1000001→65

なわけで。
いやーめんどくさいこと全部中でやってくれてるっていいね。

そんでもって2進数で計算したので、それを10進数に変換したくって調べたらparseIntはintの引数を2つ受け取るのがあってそれで2番目の引数に2を指定するとうまい具合に10進数としてくれる。
以下に適当なサンプルを書いてみる。

        for(int i=Character.MIN_RADIX; i<=Character.MAX_RADIX; i++){
            System.out.println(i +","+ Integer.parseInt("10", i));
        }

Integer.parseInt(String s, int radix)を使用しているが、ここで指定できるradixの値はCharacter.MIN_RADIX<=radix<=Character.MAX_RADIXとされているので、こういう書き方をしてみた。
(位取り記数法ってやつでradixを受け取り、いわゆるN進数のNを基数ってことで指定できるのである)

Character.MIN_RADIXはintで2、Character.MAX_RADIXはintで36。
ここでいう36とはなんだろうか。2はまだ分かる、N進数は1では成り立たないからだ。

考えた、結果。
例えば16進数であればF=15という考え方なので、アルファベットの最後である'Z'までじゃ…。
ということで少しやってみる。

        for(int i='A'; i<='Z'; i++){
            String str = ""+(char)i;
            System.out.println(str +":"+ Integer.parseInt(str, 36));
        }

( ゚д゚)ビンゴー
iはint値になってしまっているので、charに型変換してそれをさらにStringに変換してstrへ代入してある。

てな感じで何調べてたか分かんないけど、ちょっと書いてみるのが大事ですね。
Character.MAX_RADIXとかまでって書いてあるんだから、アルファベットの表現できる最小値〜最大値であることは明らかですけどね。。