我无法理解为什么它在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()
答案 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;
}