0

我有一个作业要做十进制到二进制的对话。这是我的代码:

int num = 0;
int temp = 0;

Scanner sc = new Scanner(System.in);
num = sc.nextInt();

//System.out.print(""+ num%2+ (num%2)%2);
while(num != 0) {
  temp = num;
  System.out.print(""+(int) temp % 2);
  num = num / 2;    
}

它工作正常,但它给我的输出是 LSB 而不是 MSB。

例如:

35
110001

但我需要它100011

我不能使用任何函数或方法来反转它。我知道我可以把它放在一个数组、字符串或其他任何东西中并做一些魔术。但我只能使用while循环、取模和打印。

有什么建议么?

4

4 回答 4

4

您可以从顶部开始,而不是从底部开始。

int i = 35;

// find where the top bit is.
int shift = 0;
while (i >>> (shift + 1) > 0) shift++;

// print from the top bit down
while (shift >= 0)
    System.out.print((i >>> shift--) & 1);

打印 i = 35

100011

打印 i = -35

11111111111111111111111111011101
于 2012-11-02T14:11:18.747 回答
2

数字实际上是从右到左的(猜猜他们为什么称它为“阿拉伯数字”?)。一个数字的最低有效位是它的最后一位。

您生成从最低有效到最高有效的二进制数字。您必须存储它们,然后以相反的顺序打印,从最重要到最不重要。

尝试为此使用 aList<Integer>或 an int[]

于 2012-11-02T14:11:50.143 回答
0

一种解决方法可能如下:

  int indx = 0;
  if(num<0){
      indx =31;
      num = Integer.MAX_VALUE+num+2;
  }else{
      while((int)Math.pow(2, indx) <= num){
           indx++; 
      }
       indx--;//get the highest index
  }
   System.out.print(""+1);//print the highest bit
   num = num % (int)Math.pow(2, indx);
   indx--;
   //print the bits right to left
   for(int i = indx; i >=0; i--){
     if(Math.abs(num)<2){
       System.out.print(""+num);
     }else if((int)Math.pow(2, i) >= num){
        System.out.print(""+0);
     }else{
       num = num % (int)Math.pow(2, i); //get the remaining value
       System.out.print(""+1);
     }
   }
于 2012-11-02T14:15:29.547 回答
0

不要在找到它们时输出每个数字。逐步构建您的输出,然后在最后打印它。

public static void main(String[] args)
{
    int num = 0;
    int temp = 0;

    Scanner sc = new Scanner(System.in);
            num = sc.nextInt();

    int place = 1;
    int output = 0;

    while(num != 0) {
       temp = num % 2;
       num = num / 2;    

       output += (place*temp);
       place *=10;
    }

    System.out.print(""+output);
}   

您可能需要修改它以处理大数或负数。

于 2012-11-02T14:27:59.933 回答