从二进制转换中删除前导零
Remove leading zeros from binary conversion
我想做的是仅使用按位运算符将用户输入的任意数字转换为二进制值,最大为 2^32 - 1。经过大量的摸索和修补,我得出了这个结论,似乎给了我我想要的……几乎:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter a number: ");
String input = scan.nextLine();
int dec = Integer.parseInt(input);
ArrayList<Integer> binary = new ArrayList<Integer>();
for (int i = 0; i < 32; i++) {
if ((dec & 1) == 0) {
binary.add(0);
} else {
binary.add(1);
}
dec = dec >>> 1;
}
Object[] binaryArray = binary.toArray();
for (int i = binaryArray.length - 1; i >= 0; i--) {
System.out.print(binaryArray[i]);
}
}
现在我的问题是:这确实输出了正确的二进制字符串,但我需要删除前导零,以便十进制数 10 在二进制中显示为 1010 而不是 000000000000000000000000000001010。
我是第一学期的 CS 学生,因此非常感谢任何解决问题的帮助或清理代码的提示。
第三次阅读您的代码时,我发现有些东西有点棘手。你在做什么是好的,但可能有更好的方法。我不会给出答案,但我想看看不同的东西。
代码中的 ArrayList
不需要。如果你这样写代码会怎样?
for (int i = 1 << 31; i != 0; i = i >>> 1) {
if ((dec & i) == 0) {
System.out.print( "0" ); //binary.add(0);
} else {
System.out.print( "1" ); //binary.add(1);
}
}
这里我只是简单的"print as I go." ArrayList
和数组的转换是不需要的。我已经有一个循环在工作,我不需要添加第二个循环来打印数组的所有值,因为我只使用我已有的循环。
好的,所以我的第一段代码是错误的。它以相反的顺序打印。这段代码(应该!未经测试!)从第 32 位开始,从那里开始计数 down,按顺序打印位。它还展示了如何在 for
循环中使用其他东西,例如 i = i >>> 1
而不是总是 ++
.
详细说明提示:"see"您的代码正在做的事情的一种快速方法是在代码运行时打印重要值。例如,要了解您可以使用 dec
做什么,请添加打印语句以打印其值。有人说使用调试器并单步执行代码,但我发现打印语句更快。
for( int i = 0; i < 32 ; i++ ) {
if( (dec & 1) == 0 ) {
binary.add( 0 );
} else {
binary.add( 1 );
}
dec = dec >>> 1;
System.out.println( "DEBUG: " + dec );
}
根据我对你的问题的理解,这是我能想到的。
如果您只想使用自己的方法删除前导零,这里是解决方法,但是我不建议您这样做,因为它体积庞大且不可读。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter a number: ");
String input = scan.nextLine();
int dec = Integer.parseInt(input);
ArrayList<Integer> binary = new ArrayList<>();
for (int i = 0; i < 32; i++) {
if ((dec & 1) == 0) {
binary.add(0);
} else {
binary.add(1);
}
dec = dec >>> 1;
}
StringBuilder ss = new StringBuilder();
for (int i = binary.size() - 1; i >= 0; i--) {
ss.append(binary.get(i));
}
System.out.println(Integer.parseInt(ss.toString()));
}
或者您可以使用这种方法减少代码 :) 易于阅读
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter a number: ");
String input = scan.nextLine();
int dec = Integer.parseInt(input);
char[] arr = Integer.toBinaryString(dec).toCharArray();
StringBuilder sb = new StringBuilder();
for (Character c : arr) {
sb.append(c);
}
System.out.println(sb);
}
我想做的是仅使用按位运算符将用户输入的任意数字转换为二进制值,最大为 2^32 - 1。经过大量的摸索和修补,我得出了这个结论,似乎给了我我想要的……几乎:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter a number: ");
String input = scan.nextLine();
int dec = Integer.parseInt(input);
ArrayList<Integer> binary = new ArrayList<Integer>();
for (int i = 0; i < 32; i++) {
if ((dec & 1) == 0) {
binary.add(0);
} else {
binary.add(1);
}
dec = dec >>> 1;
}
Object[] binaryArray = binary.toArray();
for (int i = binaryArray.length - 1; i >= 0; i--) {
System.out.print(binaryArray[i]);
}
}
现在我的问题是:这确实输出了正确的二进制字符串,但我需要删除前导零,以便十进制数 10 在二进制中显示为 1010 而不是 000000000000000000000000000001010。
我是第一学期的 CS 学生,因此非常感谢任何解决问题的帮助或清理代码的提示。
第三次阅读您的代码时,我发现有些东西有点棘手。你在做什么是好的,但可能有更好的方法。我不会给出答案,但我想看看不同的东西。
代码中的 ArrayList
不需要。如果你这样写代码会怎样?
for (int i = 1 << 31; i != 0; i = i >>> 1) {
if ((dec & i) == 0) {
System.out.print( "0" ); //binary.add(0);
} else {
System.out.print( "1" ); //binary.add(1);
}
}
这里我只是简单的"print as I go." ArrayList
和数组的转换是不需要的。我已经有一个循环在工作,我不需要添加第二个循环来打印数组的所有值,因为我只使用我已有的循环。
好的,所以我的第一段代码是错误的。它以相反的顺序打印。这段代码(应该!未经测试!)从第 32 位开始,从那里开始计数 down,按顺序打印位。它还展示了如何在 for
循环中使用其他东西,例如 i = i >>> 1
而不是总是 ++
.
详细说明提示:"see"您的代码正在做的事情的一种快速方法是在代码运行时打印重要值。例如,要了解您可以使用 dec
做什么,请添加打印语句以打印其值。有人说使用调试器并单步执行代码,但我发现打印语句更快。
for( int i = 0; i < 32 ; i++ ) {
if( (dec & 1) == 0 ) {
binary.add( 0 );
} else {
binary.add( 1 );
}
dec = dec >>> 1;
System.out.println( "DEBUG: " + dec );
}
根据我对你的问题的理解,这是我能想到的。
如果您只想使用自己的方法删除前导零,这里是解决方法,但是我不建议您这样做,因为它体积庞大且不可读。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter a number: ");
String input = scan.nextLine();
int dec = Integer.parseInt(input);
ArrayList<Integer> binary = new ArrayList<>();
for (int i = 0; i < 32; i++) {
if ((dec & 1) == 0) {
binary.add(0);
} else {
binary.add(1);
}
dec = dec >>> 1;
}
StringBuilder ss = new StringBuilder();
for (int i = binary.size() - 1; i >= 0; i--) {
ss.append(binary.get(i));
}
System.out.println(Integer.parseInt(ss.toString()));
}
或者您可以使用这种方法减少代码 :) 易于阅读
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter a number: ");
String input = scan.nextLine();
int dec = Integer.parseInt(input);
char[] arr = Integer.toBinaryString(dec).toCharArray();
StringBuilder sb = new StringBuilder();
for (Character c : arr) {
sb.append(c);
}
System.out.println(sb);
}