为十进制到二进制转换描述此函数

时间:2012-01-25 21:32:32

标签: java c++ c

我无法理解为什么它在Java和C ++中打印总二进制位而不是最后一位。我在C中检查它,因为我认为只是最后一位。但是,在C ++和java中,它会打印所有位。

public static void main(String[] args) {

    toBin(2);
}// end of main

static void toBin(int b) {
    int modu = 0;

    if (b < 1) {
        return;
    }
    modu = b % 2;
    b=(b>>1);
    toBin(b);
    System.out.print(modu);       

}// end of toBin()

4 个答案:

答案 0 :(得分:1)

这段代码应该在所有三种语言中做同样的事情:它以递归方式打印一个数字的所有位。

让我们了解当您拨打号码5上的toBin时发生的事情:

modu of the first level of invocation is set to 1 (5%2)
    toBin is called on 2 (5>>1)
    modu of the second level of invocation is set to 0 (4%2)
    toBin is called on 1 (2>>1)
        modu of the third level of invocation is set to 1 (1%2)
        toBin is called on 0 (1>>1)
             toBin returns because b < 1
        modu of the third level is printed: 1; toBin returns
     modu of the second level is printed: 0; toBin returns
 modu of the first level is printed: 1; toBin returns

结果,打印了101,二进制表示为5。

答案 1 :(得分:0)

您的程序(通过简单的移植工作)也可以在C中正常工作......您的问题是什么?

答案 2 :(得分:0)

在每次打电话给toBin时(除了最后一次)你打印一个数字,那么你期待什么?

如果您只想打印最后一位,则不需要递归。只是System.out.print(b%2)

答案 3 :(得分:0)

toBin()的工作方式是它首先在除以两个

时找到另一个
modu = b % 2;

将其添加到开头,然后除以2

b = b >> 1

并递归重复,直到没有任何东西为止。

if (b < 1) {
  return
}

如果你用小数来考虑它,那就更容易了。

假设您有号码4863,并且您想在10号基地打印出来。

首先你拿n%10是3,然后你除以10,然后你486.重复,你有6和48,等等。

打印在toBin(b)之后的原因是它不需要维护字符串。相反,它将首先打印最内部的递归调用,当它退出时,它将反向打印其余的。

基本上,以下(可能更容易理解)也是如此,但向后打印数字:

    while (b >= 1) {
        System.out.print(b % 2);
        b /= 2;
    }