16進数または8進数で整数定数を定義する方法と同様に、2進数で定義できますか?
私はこれが本当に簡単な(そして愚かな)質問であることを認めます。私のグーグル検索は空になります。
16進数または8進数で整数定数を定義する方法と同様に、2進数で定義できますか?
私はこれが本当に簡単な(そして愚かな)質問であることを認めます。私のグーグル検索は空になります。
回答:
そのため、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の場合:
int i = 0b10101010;
古いバージョンのJavaにはバイナリリテラルはありません(代替案については他の回答を参照してください)。
_
:シーケンスを読みやすくするために文字 int i = 0b1010_1010_0011;
Javaにはバイナリリテラルはありませんが、これは可能だと思います(要点はわかりませんが)。
int a = Integer.parseInt("10101010", 2);
エド・スワングレンからの回答
public final static long mask12 =
Long.parseLong("00000000000000000000100000000000", 2);
正常に動作します。long
代わりにを使用しint
、修飾子を追加して、ビットマスクとしての可能な使用法を明確にしました。ただし、このアプローチには2つの不便があります。
別のアプローチを提案できます
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 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
}
Googleで「Javaリテラル構文」を検索すると、いくつかのエントリが表示されます。
8進構文(数値の前に0を付ける)、10進構文、および「0x」接頭辞を付ける16進構文があります。ただし、バイナリ表記の構文はありません。
いくつかの例:
int i = 0xcafe ; // hexadecimal case
int j = 045 ; // octal case
int l = 42 ; // decimal case
byte b = 0b01000001
読みやすくするためbyte b = 0b0100_0001
)。
たくさんのバイナリをいじりたい場合は、いくつかの定数を定義できます。
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;