【问题标题】:Converstion from int to binary从 int 到二进制的转换
【发布时间】:2015-12-16 02:55:18
【问题描述】:

有没有不使用Integer.toBinaryString 方法将整数转换为二进制数的方法?
我试图找出转换的算法,但没有任何运气。

我的任务是这样的:(https://open.kattis.com/problems/reversebinary)

在 Scanner 的帮助下插入一个 Int。
将 Int 转换为二进制。
反转二进制文件。
打印出新的 Int。

例如,数字 11 在二进制中是 1011。
现在反转二进制数 1011,得到 1101(即数字 13)
并打印出 13。

这就是我得到的,但我仍然使用了Integer.toBinaryString 方法,得到了NumberFormatException

int reverse = 0;          
int number, binary;        

Scanner scn = new Scanner(System.in);          
number = scn.nextInt();         
String b = Integer.toString(number, 2);         
binary = Integer.parseInt(b);          

while (binary != 0) {          
    reverse = reverse * 10 + binary % 10;         
    binary = binary / 10;         

}
int newNumber = Integer.parseInt(String.valueOf(reverse), 2);        
System.out.println(newNumber);        

}
}

【问题讨论】:

    标签: java algorithm java.util.scanner


    【解决方案1】:

    首先,您应该使用正确的术语。您没有将 int 转换为二进制。 int 类型(以及所有数字类型)已经以二进制格式存储。当您将 int 转换为 String 或将 String 转换为 int 时,您选择String 表示使用的基数(例如十进制、二进制、八进制、十六进制等)。这决定了出现在字符串表示中的数字。现在,根据您的示例,您要做的是生成一个数字,其二进制表示是输入数字的倒数。换句话说,你想反转输入数字的位。

    你当前的循环:

    while (binary != 0) {          
        reverse = reverse * 10 + binary % 10;         
        binary = binary / 10;         
    }
    

    计算 binary 的十进制(基数 10)位,并创建一个整数,其值是这些位倒序排列时的值。

    如果您想要输入数字的二进制表示的反转,您应该乘以并除以 2 以获得输入数字的二进制数字(又名位)并将它们反转:

    while (number != 0) {     
        System.out.print (number % 2); // prints a binary digit (i.e. 0 or 1)    
        reverse = reverse * 2 + number % 2;         
        number = number / 2;         
    }
    System.out.println();
    System.out.println(reverse); // prints the decimal representation of the reversed number
    

    如果number11,则reverse 将是13,因为1011 的反面是1101。此代码将打印反转数字的二进制表示 (1101) 和十进制表示 (13)。

    【讨论】:

      【解决方案2】:

      不要将二进制反转为数字,而是在它仍然是字符串时反转它,new StringBuilder(b).reverse().toString()。然后将它从 base 2 转换回 int,就完成了。

      所以整个代码是:

          final Scanner scn = new Scanner(System.in);
          final int number = scn.nextInt();
          String b = Integer.toString(number, 2);
          b = new StringBuilder(b).reverse().toString();
          System.out.println(Integer.parseInt(b.toString(), 2));
      

      【讨论】:

        【解决方案3】:

        也许这个问题最聪明的解决方案是位移。我写了一个例子,稍微解释一下。

            int number, reverse = 0;
            Scanner scn = new Scanner(System.in);
            number = scn.nextInt();
        
            while (number > 0)
            {
                // shift all bits to the left
                reverse = reverse << 1;
                // extract the last bit of the number
                int bit = number & 1;
                // add the last bit to the reverse version
                reverse |= bit;
                // shift alle bits to the right
                number = number >> 1;
            }
            System.out.println(reverse);
        

        【讨论】:

          【解决方案4】:

          Integer.toBinaryString - 将整数参数的字符串表示形式返回为以 2 为底的无符号整数。

          String toString(int i, int radix) - 以第二个参数指定的基数返回第一个参数的字符串表示

          public static void main(String[] args) {
          
                  int reverse = 0;          
                  int number, binary;        
          
                  Scanner scn = new Scanner(System.in);          
                  number = scn.nextInt();         
                  String b = Integer.toBinaryString(number);     
                  binary = Integer.parseInt(b);          
          
                  while (binary != 0) {          
                      reverse = reverse * 10 + binary % 10;         
                      binary = binary / 10;         
          
                  }
                  int newNumber = Integer.parseInt(String.valueOf(reverse), 2);        
                  System.out.println(newNumber); 
          
              }
          

          事实上,无论你使用什么都不会出错。上面的代码完美编译没有错误。
          提供 11,完美地给出 13。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-22
          • 1970-01-01
          • 1970-01-01
          • 2019-03-18
          • 1970-01-01
          相关资源
          最近更新 更多