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難しいです(汗)。まだまだ、知らないことが一杯です、、、