私はJavaに長い変数を持っていて、それを次のようなバイナリ文字列に変換しています。
long var = 24; Long.toBinaryString(val);
これで7ビットしか出力されませんが、64ビットすべて、つまり先行ゼロもすべて表示する必要があります。どうすればこれを実現できますか?
その理由は、各ビットを繰り返し処理し、ステータスに応じて操作を実行する必要があるためですが、それを行うためのより良い方法はありますか?
私はJavaに長い変数を持っていて、それを次のようなバイナリ文字列に変換しています。
long var = 24; Long.toBinaryString(val);
これで7ビットしか出力されませんが、64ビットすべて、つまり先行ゼロもすべて表示する必要があります。どうすればこれを実現できますか?
その理由は、各ビットを繰り返し処理し、ステータスに応じて操作を実行する必要があるためですが、それを行うためのより良い方法はありますか?
ビットを反復処理する場合は、文字列に変換せずに各ビットをテストする方がよい場合があります。
if ((val & (1L << bitPosition)) != 0)
// etc
ただし、本当にバイナリ文字列が必要な場合は、これがゼロで左パディングする最も簡単な方法です。
string padding = "0000000000000000000000000000000000000000000000000000000000000000";
string result = padding + Long.toBinaryString(val);
result = result.substring(result.length() - 64, result.length()); // take the right-most 64 digits
二項演算子を使用して、longの個々のビットにアクセスできます。次のコードは、「i」の個々のビットを「true」または「false」として出力します。
long i = 1024;
for(int n = 63; n >= 0; n--)
System.out.println(n + ": " + ((i & (1L << n)) != 0));
わかりませんが、次のようになります。
int i=0, thisbit;
mask = 1;
while (i++ < 64)
{
thisbit = var & mask;
// check thisbit here...
//
var = var >>> 1;
mask*=2;
}
@Robertの答えに少し変更を加えます。ここでパディング変数を宣言する代わりに、Long.numberOfLeadingZeros(long)を使用します。
実際には、内部的にはシフト演算子のみを使用します。
はい。ビット演算の詳細については、 http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.htmlを参照してください。
それ以外の場合は、フォーマッターを使用します:http: //java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html
これは機能します。
String s = Long.toBinaryString(val);
while (s.length() < 64)
{
s = "0" + s;
}
StringBufferを使用してこれを実行する場合は、次のようになります。
StringBuffer s = new StringBuffer(Long.toBinaryString(val));
while (s.length() < 64)
{
s.insert(0, "0");
}
String str = s.toString();