我正在尝试制作一个将十进制转换为二进制的转换器,有一个局限性,我不能使用任何其他循环或语句,除了
while (){}
我无法弄清楚如何开始减去适合小数的数字,并且不能使用任何if语句。有人有建议吗?
import java.util.Scanner;
public class Converter{
static Scanner input = new Scanner (System.in);
public static void main (String[] args){
System.out.println ("What is the number in the decimal system that you want to convert to binary?");
int dec = input.nextInt();
int sqr = 1024;
int rem;
while (dec != 0){
rem = dec / sqr;
sqr = sqr / 2;
System.out.print(rem);
}
}
}
答案 0 :(得分:1)
您的代码有问题。将小数转换为二进制更容易。例如:
int num = 5;
StringBuilder bin = new StringBuilder();
while (num > 0) {
bin.append(num % 2);
num /= 2;
}
System.out.println(bin.reverse());
我使用StringBuilder反转我的String,我更喜欢String,因为二进制的长度可以是任意长度。如果使用int或long,则可能会发生溢出。
如果只想使用基本类型,则可以执行以下操作,但可能会发生溢出:
long reversedBin = 0, Bin = 0;
while (n > 0) {
reversedBin = reversedBin * 10 + (n % 2);
n /= 2;
}
while (reversedBin > 0) {
Bin = Bin * 10 + (reversedBin % 10);
reversedBin /= 10;
}
System.out.println(Bin);
答案 1 :(得分:1)
尝试一下:
import java.util.Scanner;
public class Converter {
public static void main(String[] args) {
final Scanner input = new Scanner(System.in);
System.out.println("What is the number in the decimal system that you want to convert to binary?");
int dec = input.nextInt();
int div = 128;
while (div > 0) {
System.out.print(dec / div);
dec = dec % div;
div >>= 1; // equivalent to div /= 2
}
System.out.println();
}
}
现在,让我们遍历代码并尝试了解正在发生的事情。我假设最大大小为8位,因此变量div
设置为2 n-1 ,其中n =1。如果需要16位,则div
应该是32768。
程序从该值开始,并尝试通过除法器对给定数字进行整数除法。而且,它的好处是,如果数字大于或等于除数,它将产生1,否则产生0。
因此,如果我们要转换的数字为42,然后将其除以128将得到0,因此我们知道二进制数的第一位为0。
此后,我们将数字设置为整数除法的余数,然后将除法器除以二。我这样做的时候是右移(div >>= 1
),但是您也可以使用分配器分配(div /= 2
)。
现在,除法器为64,数字仍为42。如果再次执行该操作,我们将再次获得0。
在第三次迭代中,我们将42除以32,得到的结果为1。因此,到目前为止,我们的二进制数字为001
。我们将数字设置为除法的余数,即10。
继续此操作,我们得到二进制数00101010
。当分频器div
为零且没有剩余可分的情况时,循环结束。
尝试逐步了解程序的工作方式。这很简单,但是要想出一个简单的解决方案可能非常困难。在这种情况下,它将应用数学,并了解整数数学在Java中的工作原理。附带经验,您将在适当的时候得到经验。
答案 2 :(得分:0)
请记住从十进制转换为二进制的算法。 令n为以十进制表示的数字:
digit_list = new empty stack
while n>0 do
digit = n%2
push digit in stack
n = n/2
end while
binary = new empty string
while digit_list is not empty do
character = pop from stack
append character to binary
end while
Java提供了一个通用类Stack,您可以将其用作数据结构。您也可以使用列表,但请记住以与计算它们相反的顺序来获取数字。
答案 3 :(得分:0)
找到该数字的以2为底的对数,并将其下限以找到所需的位数。然后将整数除以该位的2的幂,然后从原始数中减去该整数并重复直到0。对于负数无效。有更好的解决方案,但这是我的
int bits = (int) Math.floor(Math.log((double) dec) / Math.log((double) 2));
System.out.println("BITS:" + bits);
while (dec > 0) {
int twoPow = (int) Math.pow((double) 2, (double) bits);
rem = dec / twoPow;
dec = dec - rem * twoPow;
bits--;
System.out.print(rem);
}