(Java)指定将二进制数转换为字符串时的位数(长度)?

我正在尝试将数字存储为数组中的二进制字符串,但我需要指定存储它的位数。

例如,如果我需要用两位存储0,我需要一个字符串“00”。 或者1010有6位所以“001010”。

有人可以帮忙吗?

编辑:谢谢大家,因为我在数学/编程方面总是很垃圾,所以我选择了大卫的最简单的解决方案。 就像是:

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> =你的目标数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)); 

这里的想法是暂时将字符串解析为十进制数字(恰好包含所有1和0),然后使用String.format()。

请注意,您基本上必须使用BigInteger,因为如果您尝试使用Integer.fromString()Long.fromString() ,二进制字符串会快速溢出Integer和Long,从而导致NumberFormatExceptions。

尝试这个:

 String binaryString = String.format("%"+Integer.toString(size)+"s",Integer.toBinaryString(19)).replace(" ","0"); 

其中size可以是用户想要的任何数字

这是一个简单的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("%08d",1111);

输出:00001111

 String.format("%02d",1111); 

输出:1111