2進数リテラル
そもそも今まで、bitとかあまり意識したことがなかったのですが、JavaSE7から2進数リテラルが使えるようになっていたので試してみました。
数字の1
byte, short, int, longで使えます。charでも使えたのですが「\u0001」に該当する文字がないので表示されないようです。
void test() { byte b = 0b0000_0001; System.out.println("***** byte=" + b); System.out.println(String.format("Decimal:%d, HexDecimal:%1$x", b)); short s = 0b0000_0001; System.out.println("***** short=" + s); System.out.println(String.format("Decimal:%d, HexDecimal:%1$x", s)); int i = 0b0000_0001; System.out.println("***** int=" + i); System.out.println(String.format("Decimal:%d, HexDecimal:%1$x", i)); long l = 0b0000_0001; System.out.println("***** long=" + l); System.out.println(String.format("Decimal:%d, HexDecimal:%1$x", l)); char c = 0b0000_0001; System.out.println("***** char=" + c); System.out.println(String.format("char:%c, String:%1$s, Decimal:%2$d, HexDecimal:%2$x", c, (short)c)); }
実行結果
***** byte=1 Decimal:1, HexDecimal:1 ***** short=1 Decimal:1, HexDecimal:1 ***** int=1 Decimal:1, HexDecimal:1 ***** long=1 Decimal:1, HexDecimal:1 ***** char= char:, String:, Decimal:1, HexDecimal:1
文字の1
char c = 0b0011_0001; System.out.println("***** char=" + c); System.out.println(String.format("char:%c, String:%1$s, Decimal:%2$d, HexDecimal:%2$x", c, (short)c)); char c2 = '\u0031'; System.out.println("***** char=" + c2); System.out.println(String.format("char:%c, String:%1$s, Decimal:%2$d, HexDecimal:%2$x", c2, (short)c2));
実行結果
***** char=1 char:1, String:1, Decimal:49, HexDecimal:31 ***** char=1 char:1, String:1, Decimal:49, HexDecimal:31
文字のA、数字では10進数で65
byte b = 0b0100_0001; System.out.println("***** byte=" + b); System.out.println(String.format("Decimal:%d, HexDecimal:%1$x", b)); short s = 0b0100_0001; System.out.println("***** short=" + s); System.out.println(String.format("Decimal:%d, HexDecimal:%1$x", s)); int i = 0b0100_0001; System.out.println("***** int=" + i); System.out.println(String.format("Decimal:%d, HexDecimal:%1$x", i)); long l = 0b0100_0001; System.out.println("***** long=" + l); System.out.println(String.format("Decimal:%d, HexDecimal:%1$x", l)); char c = 0b0100_0001; System.out.println("***** char=" + c); System.out.println(String.format("char:%c, String:%1$s, Decimal:%2$d, HexDecimal:%2$x", c, (short)c)); char c2 = '\u0041'; System.out.println("***** char=" + c2); System.out.println(String.format("char:%c, String:%1$s, Decimal:%2$d, HexDecimal:%2$x", c2, (short)c2));
実行結果
***** byte=65 Decimal:65, HexDecimal:41 ***** short=65 Decimal:65, HexDecimal:41 ***** int=65 Decimal:65, HexDecimal:41 ***** long=65 Decimal:65, HexDecimal:41 ***** char=A char:A, String:A, Decimal:65, HexDecimal:41 ***** char=A char:A, String:A, Decimal:65, HexDecimal:41
逆の場合(2進数リテラルとして表示する場合)
byte b = (byte) 0x8f; String bs = Byte.toString(b); System.out.println("***** byte(toString)=" + bs); int i = Byte.toUnsignedInt(b); // JavaSE8より追加 System.out.println("***** byte(toUnsignedInt)=" + i); String bb = Integer.toBinaryString(b); // 暗黙の型変換でintになっている? System.out.println("***** byte(toBinaryString)=" + bb); String i2 = Integer.toBinaryString(i); System.out.println("***** byte(int -> toBinaryString)=" + i2);
実行結果
***** byte(toString)=-113 ***** byte(toUnsignedInt)=143 ***** byte(toBinaryString)=11111111111111111111111110001111 ***** byte(int -> toBinaryString)=10001111
Java難しいです(汗)。まだまだ、知らないことが一杯です、、、