Javaでは、整数定数をバイナリ形式で定義できますか?


85

16進数または8進数で整数定数を定義する方法と同様に、2進数で定義できますか?

私はこれが本当に簡単な(そして愚かな)質問であることを認めます。私のグーグル検索は空になります。


2
参考までに、ほとんどすべてのプログラミング言語で、イディオムは、実際のバイナリ文字列ではなく、16進数でバイナリ定数を記述することです。
abyx 2009年

3
そうですが、それは、バイナリに問題があるからではなく、16進数が利用可能な最も近いものだからだと思います。バイナリリテラルをサポートする私が使用した言語では、この機能を無視するのが慣例ではないと思います。
ケン


2017年:受け入れられる回答は、ラスによって提供されたものでなければなりません。参照:stackoverflow.com/a/1692932/716079
Lourenco 2017

回答:


65

そのため、Java SE 7のリリースでは、バイナリ表記が標準で標準装備されています。バイナリを十分に理解していれば、構文は非常に単純で明白です。

byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111; 
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;

特に、クラスレベルの変数をバイナリとして宣言するという点では、バイナリ表記を使用して静的変数を初期化することにもまったく問題はありません。

public static final int thingy = 0b0101;

数値が多すぎるデータでオーバーフローしないように注意してください。オーバーフローしないと、コンパイラエラーが発生します。

byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte

これで、本当に凝ったものにしたい場合は、数値リテラルと呼ばれるJava7の他の優れた新機能をアンダースコアと組み合わせることができます。リテラルアンダースコアを使用したバイナリ表記のこれらの派手な例を見てください。

int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;

非常に読みやすいことは言うまでもなく、今ではそれは素晴らしくてきれいではありませんか?

これらのコードスニペットは、TheServerSideでこのトピックについて書いた小さな記事から抜粋したものです。詳細については、お気軽にチェックしてください。

Java 7とバイナリ表記:OCP Javaプログラマー(OCPJP)試験の習得


3
バイトデータ= 0b0000110011なのはなぜですか。10ビットありますか?私はプログラミングに不慣れですが、8ビットのバイトデータ型に適合するには0b00110011のように見えるはずだと思います。
マイク

1
マイクと同じことを疑問に思っている人にとっては、コンパイラがそれを表す数値に変換するためです。先行ゼロが数十個ある可能性があり、実際の値には影響しません。コンパイルプロセスは、基本的に、そこに小数を書き込んだ場合と同じです。
ルークブリッグス2017年

1
定義上、プリミティブ型のバイトは、-128から127(-128から-1&0から127)の256個の数値を格納できます。しかし、バイナリリテラルを使用して-128を表す方法。たとえば、バイトb = -0b1111111; -127を示しますが、-128はどうですか?
nirmalsingh 2017年

152

Java 7の場合:

int i = 0b10101010;

古いバージョンのJavaにはバイナリリテラルはありません(代替案については他の回答を参照してください)。


33
私はそこにすることができも指摘したいと思います_:シーケンスを読みやすくするために文字 int i = 0b1010_1010_0011;
user12345613

@Russ 0bはここで何を意味しますか?この機能はJava7で何と呼ばれていますか?
オタク2012

1
0bはバイナリを意味します。この機能はバイナリリテラルと呼ばれます:docs.oracle.com/javase/7/docs/technotes/guides/language/…–
Russ Hayward

1
バイナリデータのこの新しい表現が大好きです。文字列表現は非常に読みにくいでしょう。受け入れられた回答と「@ user12345613」からの回答の違いを見てください。彼のために+1。
Marcello de Sales

54

Javaにはバイナリリテラルはありませんが、これは可能だと思います(要点はわかりませんが)。

int a = Integer.parseInt("10101010", 2);

1
他の用途の中でも、ラインとポリゴンのラスタライズの点描パターンは、いくつかの一般的なグラフィックライブラリで整数として指定されています。parseIntまたはparseShortを使用すると、開発者はパターンを簡単に視覚化できます。
charstar 2011

5
Java 7以降、RussHaywardの答えが正解です。Java 7より前は、オンラインツールまたはお気に入りの計算機を使用して、バイナリを古いJavaバージョン(8進数、10進数、または16進数)で認識される表記の1つに変換できます。別の基数を使用する場合は、バイナリ表現を含む説明コメントを宣言に配置して、読者の価値を明確にすることができます。
ジェイソンC

これはかなり汚い解決策ですよね?1バイトを表すのに16バイトを使用しているだけです(2番目の引数と変換はカウントされません)。もちろん、コンパイラがこれを最適化しない限り、私は疑っています。
トマシュザト-モニカを復活させる2014年

@TomášZato:はい、そうですが、私がこの回答を書いたときに言語がバイナリリテラルをサポートしていなかったとしたら、どのような解決策を提案しますか?ラス・ヘイワードは今、受け入れられた答えを持っているはずです。
Ed S.

快適さをあきらめて整数を使用することをお勧めします。変数の定義自体は問題ありませんが、この答えは、ユーザーがループなどにこのアプローチを使用するように動機付ける可能性があります。一般に、プログラマーはパフォーマンスのために自分の快適さをあきらめるべきだと思います。
トマシュザト-モニカを復活させる2014年

18

エド・スワングレンからの回答

public final static long mask12 = 
  Long.parseLong("00000000000000000000100000000000", 2);

正常に動作します。long代わりにを使用しint、修飾子を追加して、ビットマスクとしての可能な使用法を明確にしました。ただし、このアプローチには2つの不便があります。

  1. これらすべてのゼロを直接入力すると、エラーが発生しやすくなります
  2. 結果は、開発時に10進数または16進数の形式で利用できません。

別のアプローチを提案できます

public final static long mask12 = 1L << 12;

この式は、12番目のビットが1であることを明確にします(カウントは0から始まり、右から左になります)。マウスカーソルを合わせると、ツールチップ

long YourClassName.mask12 = 4096 [0x1000]

Eclipseに表示されます。次のようなより複雑な定数を定義できます。

public final static long maskForSomething = mask12 | mask3 | mask0;

または明示的に

public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);

変数の値は、maskForSomething開発時にEclipseで引き続き使用できます。


素晴らしいソリューション!(public final static long mask12 = 1L << 12;)
Jyro117 2012

16

マスキングにバイナリ定数を使用する

定数を宣言します:

public static final int FLAG_A = 1 << 0;
public static final int FLAG_B = 1 << 1;
public static final int FLAG_C = 1 << 2;
public static final int FLAG_D = 1 << 3;

そしてそれらを使用します

if( (value & ( FLAG_B | FLAG_D )) != 0){
    // value has set FLAG_B and FLAG_D
}

12

Googleで「Javaリテラル構文」を検索すると、いくつかのエントリが表示されます。

8進構文(数値の前に0を付ける)、10進構文、および「0x」接頭辞を付ける16進構文があります。ただし、バイナリ表記の構文はありません。

いくつかの例:

int i = 0xcafe ; // hexadecimal case
int j = 045 ;    // octal case
int l = 42 ;     // decimal case

1
これは質問に答えません。
Michael McQuade 2017

2017年:幸いなことに、バイナリ表現の表記法があります。「0b」で始まります。例:( byte b = 0b01000001読みやすくするためbyte b = 0b0100_0001)。
ローレンコ2017

2

たくさんのバイナリをいじりたい場合は、いくつかの定数を定義できます。

public static final int BIT_0 = 0x00000001;
public static final int BIT_1 = 0x00000002;

または

public static final int B_00000001 = 0x00000001;
public static final int B_00000010 = 0x00000002;
public static final int B_00000100 = 0x00000004;

0

もう少し厄介な答え:

public class Main {

    public static void main(String[] args) {
        byte b = Byte.parseByte("10", 2);
        Byte bb = new Byte(b);
        System.out.println("bb should be 2, value is \"" + bb.intValue() + "\"" );
    }

}

[java] bbは2で、値は「2」です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.