【问题标题】:(Java) Specify number of bits (length) when converting binary number to string?(Java)将二进制数转换为字符串时指定位数(长度)?
【发布时间】:2010-10-12 04:03:02
【问题描述】:

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

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

谁能帮忙?

编辑:谢谢大家,因为我一般在数学/编程方面都很垃圾,所以我选择了最简单的解决方案,即 David 的解决方案。比如:

binaryString.append(Integer.toBinaryString(binaryNumber));
for(int n=binaryString.length(); n<numberOfBits; n++) {
                        binaryString.insert(0, "0");
}

它似乎工作得很好,所以除非它效率很低,否则我会用它。

【问题讨论】:

  • 这不适用于负数和大于 2^31 的数字,因为它们不适合 Java 整数。 BigInteger 自动调整用于存储值的位数。您仍然可以使用填充方法在前面插入 0。
  • 对不起,我不知道标记接受的事情。感谢费尔南多的提醒,但我认为对于任何负数或任何大于 2^16 的数字都不需要这样做,所以我想这应该没问题。无论如何,我会看看 BigInteger。

标签: java binary


【解决方案1】:

使用Integer.toBinaryString(),然后检查字符串长度,并在其前面添加所需数量的零以达到所需长度。

【讨论】:

  • String.format("%08d", Integer.valueOf(Integer.toBinaryString(my_integer)))
  • 我知道这是一个迟到的回复,但值得注意的是@Logic1 给出的“提示”可能会导致问题。如果你有一个足够大的整数,这将导致溢出,并给你意想不到的结果。我要使用的单行代码是: String.format("%32s", Integer.toBinaryString(flagValue.getIntValue())).replace(' ', '0')
【解决方案2】:

忘记自制解决方案。请改用标准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();
    }
}

【讨论】:

    【解决方案3】:

    这是一个常见的家庭作业问题。您可以编写一个很酷的循环来计算 2 的最小幂 >= 您的目标数 n

    因为它是 2 的幂,所以以 2 为底的对数就是位数。但是 Java math 库只提供自然对数。

    math.log( n ) / math.log(2.0) 
    

    是位数。

    【讨论】:

      【解决方案4】:

      更简单:

      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。

      【讨论】:

        【解决方案5】:

        试试这个:

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

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

        【讨论】:

          【解决方案6】:

          这是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
          

          当然,您需要自己使长度参数足以表示整个值。

          【讨论】:

            【解决方案7】:
            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】:

              所以在这里你可以写你想要的长度而不是 8,它会相应地附加零。如果您提到的整数的长度超过了提到的数字的长度,那么它将不会附加任何零

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

              输出:00001111

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

              输出:1111

              【讨论】:

                猜你喜欢
                • 2014-12-15
                • 2011-03-16
                • 1970-01-01
                • 1970-01-01
                • 2014-05-10
                • 2014-07-10
                • 2010-10-16
                • 1970-01-01
                • 2018-06-07
                相关资源
                最近更新 更多