Java 整数的二进制格式

Java 整数的二进制格式,java,Java,我有一种方法可以打印出二进制形式的数字: private static void binary(int n){ for(int i = 1; i < Math.pow(2, n); i++) System.out.println(Integer.toBinaryString(i)); } } 有没有这样的打印方法: 001 010 011 100 101 110 111 我会把它写成 private static void binary(int n){

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

private static void binary(int n){
   for(int i = 1; i < Math.pow(2, n); i++)
      System.out.println(Integer.toBinaryString(i));
   }
} 
有没有这样的打印方法:

001
010
011
100
101
110
111
我会把它写成

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){
   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);
   }
} 
私有静态无效二进制文件(int n){
字符串t=”“;int N=1
私有静态无效二进制(int N){
字符串t=“”;int N=1快速/脏版本:

System.out.println(Integer.toBinaryString(i+(1<<n)).substring(1));
System.out.println(Integer.toBinaryString(i+)(1Quick/Dirty版本:

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

这可能不是最有效的解决方案,但它很简单,也很短。

试试:

String.format("%" + n + "s", Integer.toBinaryString(i)).replace(' ', '0')
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))));
   }
} 
它可能不是最有效的解决方案,但它足够简单和简短。

私有静态voidbinary(intn){
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))));
   }
} 
for(inti=1;i

专用静态无效二进制文件(int n){
for(inti=1;i


不幸的是String.format/Formatter没有二进制格式。:(不幸的是String.format/Formatter没有二进制格式。:(如果n=4,我必须将“000”改为“0000”!@Sam已修复,抱歉。我没有确切的要求。谢谢,现在它很完美:)一个很好的面试问题:这段代码中最低效的部分是什么?你如何修改它?;)移动声明不会改变性能。Peter可能指的是Math.pow的重复使用(这是一个很慢的函数,但今天编译器可能会自动优化它,使其达到2的幂)。使用StringBuilders而不是串联字符串可能会产生影响,但可能几乎无法测量。这里真正慢的是println,但您不能真正避免它,您可以少做一次。如果n=4,我必须将“000”更改为“0000”!@Sam修复,抱歉。我没有确切的要求。谢谢,现在它很完美:)一个很好的面试问题:这段代码中最低效的部分是什么?你如何修改它?;)移动声明不会改变性能。Peter可能指的是Math.pow的重复使用(这是一个很慢的函数,但今天编译器可能会自动优化它,使其达到2的幂)。使用StringBuilder而不是串联字符串可能会产生影响,但可能几乎无法测量。这里真正慢的是println,但您不能真正避免它,您可以少做一次。稍微不同的方案是concat“0000”唯一的问题是Java没有
tail()
方法,因此必须进行丑陋的计算才能找到起点。是的,但这里的其他解决方案已经做到了这一点,所以我决定展示一个(主要是)数值替代方案。(但我过去也使用过你的解决方案。)其他解决方案肯定是围绕罗宾汉的谷仓来做的。一个稍微不同的方案是将“0000”浓缩到字符串前面,然后取一个固定长度的尾部。唯一的问题是Java没有
尾部()
方法,因此您必须进行丑陋的计算来确定起点。是的,但这里的其他解决方案已经做到了这一点,因此我决定展示一个(主要)数值替代方案。(但我过去也使用过您的解决方案。)其他的解决方案肯定是围绕罗宾汉的谷仓来做的。那是错误的。
Integer.toBinaryString
的返回值是
String
,而不是Integer。编辑后,我意识到,当我发布时。想想看,我真的不喜欢再次解析它的方式。那是错误的。
Integer.toBinaryString
的返回值是
String
,不是整数。经过编辑,我在发布时意识到了这一点。想想看,我真的不喜欢再次解析它的方式。
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))));
   }
}