web-dev-qa-db-ja.com

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

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

これは本当に簡単な(そして愚かな)質問だと認めます。 Google検索が空になります。

84
Aaron Fi

したがって、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

さて、本当に空想を得たい場合は、アンダースコア付き数値リテラルとして知られるJava 7の他のきちんとした新機能を組み合わせることができます。 :

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

読みやすいのは言うまでもなく、これはすてきできれいではありませんか?

TheServerSideでこのトピックについて書いた小さな記事からこれらのコードスニペットを引き出しました。詳細については、自由にチェックしてください。

Java 7およびバイナリ表記:OCPをマスターするJava Programmer(OCPJP)Exam

64

In Java 7:

int i = 0b10101010;

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

152
Russ Hayward

Javaにはバイナリリテラルはありませんが、これを行うことができると思います(ポイントはわかりませんが)。

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

エド・スワンレンからの答え

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で引き続き使用できます。

18
chgman

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

定数を宣言します:

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
}
16
pawelzieba

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

8進構文(数字の前に0)、10進構文、16進構文に「0x」プレフィックスがあります。ただし、バイナリ表記の構文はありません。

いくつかの例:

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

たくさんのバイナリをいじりたいなら、いくつかの定数を定義できます:

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;
2
Anthony Hayward

少し厄介な答え:

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」です

0
NSherwin