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とかまでって書いてあるんだから、アルファベットの表現できる最小値〜最大値であることは明らかですけどね。。