当前位置: 首页 > 知识库问答 >
问题:

从二进制转换中删除前导零

柴亦
2023-03-14

我想做的是将用户输入的任何高达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,而不是0000000000000000000000 1010。

我是第一学期的计算机科学专业的学生,所以任何关于解决问题的帮助或清理代码的提示都将不胜感激。

共有2个答案

岳承悦
2023-03-14

根据我对你问题的理解,这是我能想到的。

如果你只是想用你自己的方法删除前导零,这里是解决方法,但是我不建议你这么做,因为它太大,不可读。

  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);
  }
蓝夕
2023-03-14

第三次阅读你的代码时,我注意到有些事情有点棘手。你正在做的是好的,但可能有更好的方法。我不打算给出答案,但我想看一些不同的东西。

不需要代码中的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);
     }
  }

在这里,我只是简单地“边走边打印”不需要ArrayList和到数组的转换。我已经有一个循环在工作,我不需要添加第二个循环来打印数组的所有值,因为我只使用我已有的循环。

好的,所以我的第一个代码是错误的。它以相反的顺序打印。这个代码(应该!未经测试!)从32位开始,从那里开始倒计时,按顺序打印位。它还展示了如何在循环中使用其他东西,如i=i

详细说明提示:一种快速“查看”代码正在做什么的方法是在代码运行时打印重要值。例如,要了解如何使用dec,请添加一条print语句来打印其值。有些人说使用调试器和单步执行代码,但我发现打印语句更快。

     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 );
     }

 类似资料:
  • 我正在尝试使用Python中的bin()函数将整数转换为二进制。但是,它总是删除前导零,这是我实际需要的,因此结果总是8位: 例子: 有办法做到这一点吗?

  • 我想知道如何将舞蹈方法的十进制结果包含到灯光方法中。例如,在这个程序中,如果我输入5F,十进制结果将是95。我希望95在light方法中显示为静态int变量,以便转换为二进制数。如果你能告诉我如何将十六进制数限制在2位数以内,那也会很有帮助。感谢阅读! } }

  • 我编写了简单的java代码将十进制转换为8位二进制:很抱歉这个愚蠢的问题 //int j=8-结果。长度();//对于(int i=0;i 结果是:dec长度为:1****反转前8位:10000 8位表示:00001 但当我删除第13行时(结果=0;)编译器打印7星号(*),原因是什么?每次都会更新结果的长度

  • 我正在尝试从二叉查找树中删除节点。我可以成功地删除树上的任何其他节点,除了一个特殊的情况。如果目标节点有两个子节点,左边的子节点有右边的子树,我可以定位正确的替换节点,并将值切换到目标节点,但替换节点永远不会被删除。 看看上面的图片,如果我尝试删除17,程序将正确地导航到13,并用13替换17,但它不会像预期的那样删除原来的13。 我附加了我的remove方法和其中引用的方法。 这是我的Node类

  • 本文向大家介绍十进制到二进制转换,包括了十进制到二进制转换的使用技巧和注意事项,需要的朋友参考一下 十进制数字也可以转换为二进制格式。要将十进制数转换为二进制数,我们需要将数字除以2,直到达到0或1。然后,在每一步骤中,其余部分将分开存储以形成相反的二进制等效数。 在此算法中,我们将遵循递归方法。这将帮助我们在不使用堆栈数据结构的情况下解决问题。在实现中,我们知道函数的递归将遵循内部堆栈。我们将使

  • 我试着删除二叉查找树的节点,当我打印出来的时候,我得到的结果实际上不是这个删除,实际上可以删除二叉树本身的任何键。 我是二进制搜索树的新手。有人能帮我写代码吗?我们将感谢您的帮助。 谢谢 完整代码