(Java)2進数を文字列に変換するときにビット数(長さ)を指定しますか?
質問
数値を配列のバイナリ文字列として保存しようとしていますが、保存するビット数を指定する必要があります。
たとえば、2ビットで0を保存する必要がある場合、文字列「00」が必要です。または、6ビットの1010で「001010」。
誰でも助けてもらえますか?
編集:数学/プログラミング全般にごみがありますので、Davidの最も簡単な解決策に取り組みました。次のようなもの:
binaryString.append(Integer.toBinaryString(binaryNumber));
for(int n=binaryString.length(); n<numberOfBits; n++) {
binaryString.insert(0, "0");
}
それはうまく機能しているようですので、非常に非効率でない限り、私はそれを使います。
解決
Integer.toBinaryString()
を使用して、文字列の長さを確認し、必要な長さにするために必要な数のゼロを先頭に追加します。
他のヒント
自家製のソリューションは忘れてください。代わりに標準の BigInteger を使用してください。ビット数を指定し、toString(int radix)メソッドを使用して必要なものを復元できます(radix = 2が必要だと仮定します)。
編集:ビット制御はBigIntegerに任せます。オブジェクトは内部でビットバッファのサイズを変更して、新しい数値の次元に合わせます。さらに、このオブジェクトを使用して算術演算を実行できます(バイナリ加算器/乗算器などを実装する必要はありません)。基本的な例を次に示します。
package test;
import java.math.BigInteger;
public class TestBigInteger
{
public static void main(String[] args)
{
String value = "1010";
BigInteger bi = new BigInteger(value,2);
// Arithmetic operations
System.out.println("Output: " + bi.toString(2));
bi = bi.add(bi); // 10 + 10
System.out.println("Output: " + bi.toString(2));
bi = bi.multiply(bi); // 20 * 20
System.out.println("Output: " + bi.toString(2));
/*
* Padded to the next event number of bits
*/
System.out.println("Padded Output: " + pad(bi.toString(2), bi.bitLength() + bi.bitLength() % 2));
}
static String pad(String s, int numDigits)
{
StringBuffer sb = new StringBuffer(s);
int numZeros = numDigits - s.length();
while(numZeros-- > 0) {
sb.insert(0, "0");
}
return sb.toString();
}
}
これはよくある宿題の問題です。 2のべき乗の最小値を計算するクールなループがあります&gt; =ターゲット番号 n 。
2の累乗なので、2を底とする対数はビット数です。ただし、Java math
ライブラリは自然対数しか提供しません。
math.log( n ) / math.log(2.0)
はビット数です。
さらにシンプル:
String binAddr = Integer.toBinaryString(Integer.parseInt(hexAddr, 16));
String.format("%032", new BigInteger(binAddr));
ここでの考え方は、文字列を一時的に10進数として解析し(たまたますべて1と0で構成される)、String.format()を使用することです。
基本的にはBigIntegerを使用する必要があることに注意してください。これは、 Integer.fromString()
または Long.fromString()
。
これを試してください:
String binaryString = String.format("%"+Integer.toString(size)+"s",Integer.toBinaryString(19)).replace(" ","0");
サイズは、ユーザーが望む任意の数にすることができます
int
値の簡単なソリューションです。それをどのように拡張するかは明らかです。バイトなど
public static String bitString(int i, int len) {
len = Math.min(32, Math.max(len, 1));
char[] cs = new char[len];
for (int j = len - 1, b = 1; 0 <= j; --j, b <<= 1) {
cs[j] = ((i & b) == 0) ? '0' : '1';
}
return new String(cs);
}
サンプルテストケースのセットからの出力は次のとおりです。
0 1 0 0
0 -1 0 0
0 40 00000000000000000000000000000000 00000000000000000000000000000000
13 1 1 1
13 2 01 01
13 3 101 101
13 4 1101 1101
13 5 01101 01101
-13 1 1 1
-13 2 11 11
-13 3 011 011
-13 4 0011 0011
-13 5 10011 10011
-13 -1 1 1
-13 40 11111111111111111111111111110011 11111111111111111111111111110011
もちろん、長さパラメーターを値全体を表すのに適切なものにするのはあなた自身です。
import java.util.BitSet;
public class StringifyByte {
public static void main(String[] args) {
byte myByte = (byte) 0x00;
int length = 2;
System.out.println("myByte: 0x" + String.valueOf(myByte));
System.out.println("bitString: " + stringifyByte(myByte, length));
myByte = (byte) 0x0a;
length = 6;
System.out.println("myByte: 0x" + String.valueOf(myByte));
System.out.println("bitString: " + stringifyByte(myByte, length));
}
public static String stringifyByte(byte b, int len) {
StringBuffer bitStr = new StringBuffer(len);
BitSet bits = new BitSet(len);
for (int i = 0; i < len; i++)
{
bits.set (i, (b & 1) == 1);
if (bits.get(i)) bitStr.append("1"); else bitStr.append("0");
b >>= 1;
}
return reverseIt(bitStr.toString());
}
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);
for (i = (len - 1); i >= 0; i--)
dest.append(source.charAt(i));
return dest.toString();
}
}
出力:
myByte: 0x0
bitString: 00
myByte: 0x10
bitString: 001010
したがって、ここでは8の代わりに希望の長さを書き込むことができ、それに応じてゼロが追加されます。言及された整数の長さが言及された数の長さを超える場合、ゼロは追加されません
String.format(&quot;%08d&quot;、1111);
出力:00001111
String.format("%02d",1111);
出力:1111