我一直在尝试编写一个小而简单的程序,将dec数转换为bin。这个想法是,当用户输入一个正整数时,一个for循环必须经历所有轮次的数字。 / 2但它也必须得到尾部(idk数学术语真的是精确的bin数)并将它们写在一个数组中,这就是我遇到麻烦的部分。我已经预定了30的数组大小(无法找到方法制作一个工作数组而不指定它的长度)我的想法是,然后我可以制作一个反向数组,其长度=索引(来自第一个循环)来自前一个数组,另一个用于循环等但是当我测试时我得到的第一个数组是打印空括号:[]或者什么都没有,eclipse在代码中找不到任何错误,我无法弄清楚什么是错的。我可以使用一些帮助。不管怎样,这里的代码是:< / p>
public static void decToBin(){
int n;
Scanner in = new Scanner(System.in);
System.out.println("Enter a positive integer:");
n = in.nextInt();
in.close();
if (n <= 0) {System.out.println("ERROR:n<=0");return;}
else if (n > 0){
int[] ostataci = new int[30];
for (int i = 0;n <= 0;i++){
ostataci[i] = n % 2;
n = n / 2;
// System.out.printf("%d %n", ostataci[i]); - even this one doesnt print at all
}
// System.out.println(Arrays.toString(ostataci)); - nor this one
}
}
感谢回复我已经学到了一些新的东西。但是因为我是一个新手,我想用我描述的方法来指示我在for循环中的错误,这是我最大的问题,无论如何继承人代码我写的(工作正常)这就是我试图从开始做的事情。
public static void decToBin2(){
int n;
Scanner in = new Scanner(System.in);
System.out.println("Enter a positive integer:");
n = in.nextInt();
in.close();
int i = 0;
int[] ostataci = new int[32];
if (n <= 0) {System.out.println("ERROR:n<=0");return;}
else if (n > 0){
while (n > 0){
i++;
ostataci[i] = n % 2;
n = n / 2;
}
}
int reverse = i;
int[] reversed = new int[reverse];
for (int i2 = 0;i2 != reverse;i--,i2++){
reversed[i2] = ostataci[i];
System.out.print(reversed[i2]);
}
}
答案 0 :(得分:1)
立即错误发生在 for loop :
中 else if (n > 0) {
// Since n > 0 it'll never run
for (int i = 0;n <= 0;i++)
实现本身可能就是这样(保持简单!):
...
if (n <= 0)
System.out.println("ERROR:n<=0");
else {
// Why do we need array/ArrayList etc.? We are supposed to build a string!
StringBuilder Sb = new StringBuilder();
// while we have something to do...
// (are we supposed to compute exact number of steps? No)
while (n > 0) {
Sb.insert(0, n % 2);
n /= 2;
}
System.out.println(Sb.toString());
}
答案 1 :(得分:0)
你的for循环是错误的for (int i = 0;n <= 0;i++){
这只是不会运行将它更改为类似while (n > 0) {
的内容,你的代码将正常工作。同样int is 32 bit所以将int[] ostataci = new int[30];
更改为int[] ostataci = new int[32];
,但最好使用list
代替array
。
答案 2 :(得分:0)
您的循环for (int i = 0;n <= 0;i++){ }
无法执行,因为您知道n
为正(按if
条件),但for
条件要求n为否定(n <= 0
)。我怀疑你的意思是n>0
。
对于可变长度数组,您可以使用列表,尽管稍后可能会更好地添加
答案 3 :(得分:0)
在计算机上已经将小数转换为二进制,为什么不使用位运算来检查保存的整数?例如,要检查是否设置了int的位n,请计算布尔值(number >> n) & 1
。把它放在一个循环中你就完成了。其他人都让它太复杂了。
答案 4 :(得分:0)
这是一种替代方法,使用移位运算符和位掩码:
public static int[] dec2bin(int n) {
int[] result = new int[32];
for (int i = 0; i < 32; i++) {
result[31-i] = n & 0x1;
n >>= 1;
}
return result;
}
这对负数也适用。
使用示例:
public static void main(String[] args) {
int[] result = dec2bin(5);
for (int i : result)
System.out.print(i);
System.out.flush();
}
输出继电器:
00000000000000000000000000000101
<强> 释 强>
上面的代码n & 0x1
是位掩码。 0x1是数字1
的十六进制表示法。在二进制文件中,该数字如下所示:
00000001
在for循环的第一次迭代中,n
看起来像:
00000101
&
运算符对两个数字中的位进行逐位(按位)比较,“将它们”组合在一起,根据这些比较生成一个新数字。如果相应位中的任何一个或两个都是0
,则结果位为0
。如果它们都是1
,则结果位为1
。因此,对于上面列出的两个数字,将它们“和”在一起的结果是:
00000001
或者,在十进制中,1
。您会注意到,这也恰好是n
中最右边位的位值。我们保存到最右边索引的result
数组中。
接下来,我们将>>
} n
改为1
。这会将每一位移动一个(最右边的位丢失),结果n
现在是:
00000010
我们重复该过程32次(对于int
的32位中的每一位),最后我们得到一个包含正确答案的result
数组。
答案 5 :(得分:-1)
Try this:
package mypackage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.Arrays;
public class Converter{
final static int ARRAY_SIZE = 30;
public static void main(String[] args){
int n;
Scanner in = new Scanner(System.in);
System.out.println("Enter a positive integer:");
n = in.nextInt();
in.close();
if (n <= 0){
System.out.println("ERROR:n<=0");
return;
}else if (n > 0){
int[] ostataci = new int[ARRAY_SIZE];
int i = 0;
while (n>0){
ostataci[i] = n % 2;
i++;
n = n / 2;
System.out.printf("%d %n", ostataci[i]);
}
System.out.println("All done!");
System.out.println(Arrays.toString(ostataci));
}
}
}