反转二进制表示形式的整数

问题描述

我试图创建一个代码,用Java取一个整数并以二进制形式输出。问题似乎是二进制文件正在向后打印。例如,6应该输出011,但输出110

import java.util.Scanner;

public class LabProgram {
  public static void main(String[] args) {

    int userNum;

    Scanner in =new Scanner(System. in );

    userNum = in.nextInt();

    binary(userNum);
    System.out.print("\n");
  }

  private static void binary(int userNum) {
    int remainder;

    while (userNum <= 1) {
      System.out.print(userNum);
      return;
    }

    remainder = userNum % 2;
    binary(userNum >> 1);
    System.out.print(remainder);
  }
}

我尝试合并一个推入堆栈,以将其余部分推入一个堆栈中,以便稍后再拉入,但无法完全将其降落。

private static void reverse(int userNum) {

  String backwards;

  while (userNum >= 0) {
    backwards.push(int userNum);
    System.out.println(backwards);
    return;
  }
}

这是课堂作业的一部分,要求以下内容

编写一个程序,该程序接受一个正整数作为输入,并输出代表二进制整数的1和0的字符串。对于整数x,算法为:

As long as x is greater than 0
   Output x % 2 (remainder is either 0 or 1)
   x = x / 2

注意:以上算法以相反的顺序输出0和1。

例如:如果输入是:

6

输出为:

011

6的二进制形式是110;算法会反向输出位。

这些是程序应用的测试和我的结果。

输入6

您的输出binary is:110

预期输出011

输入19

您的输出10011

预期输出11001

输入255

您的输出11111111

预期输出11111111

对此有任何帮助或指导,我将不胜感激。

解决方法

根据要求,不考虑负数

import java.util.Scanner;

public class LabProgram {
    public static void main(String[] args) {
        int userNum;

        Scanner scnr = new Scanner(System.in);

        userNum = scnr.nextInt();

        while(userNum > 0){
            System.out.print(userNum % 2);
            userNum = userNum / 2;
        }
        System.out.print("\n");
    }
}
,

首先使用预定义方法,然后再使用自定义方法。

public class IntToBinary {

    public static void main(String[] args) {
        int decimalNumber = 10;

        System.out.println(Integer.toBinaryString(decimalNumber));

        System.out.println(convertBinary(10));
    }

    public static String convertBinary(int num) {
        StringBuilder sb = new StringBuilder();
        int binary[] = new int[40];
        int index = 0;
        while (num > 0) {
            binary[index++] = num % 2;
            num = num / 2;
        }
        for (int i = index - 1; i >= 0; i--) {
            sb.append(binary[i]);
        }
        return sb.toString();
    }

}
,

您的程序似乎可以正常工作。但是,它不处理负数,负数具有自己的唯一二进制表示形式,称为two's complement。您可以执行以下操作来容纳:

private static void binary(int userNum) {
    int remainder;

   //  while (userNum <= 1) {
   //     System.out.print(userNum);
   //     return;
   // }
   if (userNum == 0) {
          return;
    }

    // simply mask off the bit instead of dividing by two
    remainder = userNum & 1;
    // and shift right thru the sign bit
    binary(userNum >>> 1);
    System.out.print(remainder);    
}
}

binary(-6));

打印

11111111111111111111111111111010

这些按正确顺序打印的原因是因为您的例程是递归的。通过递归过程打印存储在堆栈中的值是一种自然的行为。