2017-06-18 141 views
1

所以我被要求编写一个程序,将二进制数转换为小数。在这种情况下,它是10111.我有的问题是我不允许使用math.pow,所以我必须使用嵌套循环。这是我迄今为止所拥有的。二进制到十进制,没有在java中使用math.pow

public static void main(String[] args) { 

     int x = 10111; 

     int num = 0, counter = 0; 

     for (int i = 1; i <= x; i *= 10) { 

      int binaryDigit = x/i%10; 
      num += (int) (Math.pow(2, counter) * binaryDigit); 
      counter++; 
     } 
     System.out.println("\""+ x + "\" in binary is equivalent to " + num + " in decimal"); 
    } 
+0

您还可以通过电源5 = 2 * 2 * 2 * 2 * 2 –

+0

乘以loop.2 @ luk2302代码的作品,但我这样做问题是我想用循环替换math.pow。 – Gandalf

+0

@FastSnail确实。由于问题代码中的循环以最低有效位开始,所以实际上可以在相同的循环内计算功率。 (如我的答案中所做的那样) – Jay

回答

1

,你去通过在循环的二进制数字你可以在当前数字位置的值的两倍。 这样你就可以在每一步中获得你需要的pow值。 1,2,4,8,16,...

public static void main(String[] args) { 

    int x = 10111; 

    int num = 0; 

    int digitval = 1; 

    for (int i = 1; i <= x; i *= 10) { 

     int binaryDigit = x/i%10; 
     num += digitval * binaryDigit; 
     digitval *= 2; 
    } 
    System.out.println("\""+ x + "\" in binary is equivalent to " + num + " in decimal"); 
} 
+0

这是我正在寻找的方法。由于我正在介绍Java编程。我只能使用你描述的基本方法。我运行代码,它的工作。非常感谢。 – Gandalf

3

您可以使用位移来计算Java的两个幂。

注意到1是2 。还要注意,以二进制表示法向1右侧添加k零产生了k的2次幂,出于同样的原因,即以十进制表示法添加零将该数字乘以十。

因此,可以用这种简单的表达式替换调用Math.pow

num += (1 << counter) * binaryDigit; 

注:代表仅1和0组成的十进制数具有不方便的限制的二进制数:你不能代表数字在1023以上,因为你用完了十进制数字。更方便的表示形式是String

+0

我会加强你的回答:除非你已经在使用浮点值('float'' double'),否则你应该**永远不要使用**'Math.pow()'!. – Robert

+0

@Robert我不知道“从来没有”,这是一个太强大的声明,但我同意将'Math.pow'转换为'int'是一个非常强烈的信号,你应该寻找一个更好的替代方案来做一样。 – dasblinkenlight

+1

此方法可行,但我很抱歉,我的导师不允许我使用它。不管怎么说,还是要谢谢你。 – Gandalf

0

也许这样的事情会做的伎俩

int binaryNumber = x; 
int power = 0; 
int result = 0; 
while (binaryNumber/10 > 0) { 
//lets start the loop and parse the length of the binary number 
int digit = binaryNumber % 10; 
result += digit << power; 
power++; 
binaryNumber = binaryNumber/10; 
}