【问题标题】:Binary format of an integer整数的二进制格式
【发布时间】:2013-01-10 21:53:25
【问题描述】:

我有一个方法可以打印出二进制形式的数字:

private static void binary(int n){
   for(int i = 1; i < Math.pow(2, n); i++)
      System.out.println(Integer.toBinaryString(i));
   }
} 

输出类似于 n = 3:

1
10
11
100
101
110
111

有没有办法像这样打印出来:

001
010
011
100
101
110
111

【问题讨论】:

  • 不幸的是 String.format/Formatter 没有二进制格式。 :(

标签: java


【解决方案1】:
    private static void binary(int n){
       String t = ""; int N = 1<<n;
       for (int i=0; i<n;i++) t += "0";
       for (int i = 1; i < N; i++) {
             String s = Integer.toBinaryString(i);
             System.out.println(t.substring(s.length())+s);
       }
    } 

【讨论】:

  • 如果n = 4,我必须把“000”改成“0000”!
  • @Sam 已修复,抱歉。我没有确切的要求。
  • 谢谢,现在完美了:)
  • 一个很好的面试问题:这段代码中效率最低的部分是什么,你如何改变它? ;)
  • 移动声明不会改变性能。 Peter 可能一直在指出重复使用 Math.pow (这是一个缓慢的函数,但今天的编译器可能会自动优化它以实现 2 的幂)。使用 StringBuilders 而不是连接字符串可能会产生影响,但可能几乎无法衡量。这里真正慢的是 println,但你无法真正避免它,你可以减少它的频率。
【解决方案2】:

我会这样写

private static void binary(int n){
   for(long i = 0, max = 1 << n; i < max; i++) {
      String s = Long.toBinaryString(i);
      while (s.length() < n) s = '0' + s;
      System.out.println(s);
   }
} 

或者更高效

private static void binary(int n) {
    char[] chars = new char[n];
    for (long i = 0, max = 1 << n; i < max; i++) {
        for (int j = 0; j < n; j++)
            chars[j] = (char) (((i >>> (n - j - 1)) & 1) + '0');
        System.out.println(chars);
    }
}

binary(3);

打印

000
001
010
011
100
101
110
111

【讨论】:

    【解决方案3】:

    快速/脏版:

    System.out.println(Integer.toBinaryString(i+(1<<n)).substring(1));
    

    (如果 n == 整数中的位数,或者如果您的整数中的位数比您想要打印的多...那么有限,但如果您知道输入可能会更简单一些)

    【讨论】:

    • 稍微不同的方案是将“0000”连接到字符串的前面,然后采用固定长度的尾部。唯一的问题是Java没有tail()方法,所以你必须进行丑陋的计算才能确定起点。
    • 是的,但是这里的其他解决方案已经做到了,所以我决定展示一个(大部分)数字替代方案。
    • (但我过去也使用过你的解决方案。)
    • 其他解决方案肯定是在 Robin Hood 的谷仓中完成的。
    【解决方案4】:

    试试:

    String.format("%" + n + "s", Integer.toBinaryString(i)).replace(' ', '0')
    

    它可能不是最有效的解决方案,但它足够简单和简短。

    【讨论】:

      【解决方案5】:
      private static void binary(int n){
         for(int i = 1; i < Math.pow(2, n); i++)
            System.out.println(String.format("%04d", Integer.parseInt(Integer.toBinaryString(i))));
         }
      } 
      

      How can I pad an integers with zeros on the left?

      【讨论】:

      • 错了。 Integer.toBinaryString 的返回值是String,不是整数。
      • 已编辑,我在发布时意识到这一点。想想看,我真的不喜欢它必须再次解析。
      猜你喜欢
      • 2011-07-12
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2011-06-12
      • 2012-08-02
      相关资源
      最近更新 更多