黑马程序员技术交流社区

标题: 求解! [打印本页]

作者: HM周一帆    时间: 2013-3-28 20:20
标题: 求解!
本帖最后由 HM周一帆 于 2013-3-28 21:58 编辑

                               double x =0.01;
                int c=0;
                while (x<8848  ) {
                   c++;
                   x=1<<c;
                }
                System.out.println(c);
                }
这个是一到程序题结果是14
                                int x =1;
                int c=0;
                while (x<884800 ) {
                   c++;
                   x=1<<c;
                }
                System.out.println(c);
                }
  这个结果是20    求解答的
作者: HM张勇    时间: 2013-3-28 20:57
<<:左移运算符,1<<c代表把1的二进制数字0000 0000 0000 0001向左移动一位,末位补零。

初始值x=0.01,c=0

第一次循环:c++运算后c=1,   x=1<<c后0000 0000 0000 0001变成0000 0000 0000 0010,即x=2

第二次循环:c++运算后c=2,   x=1<<c后0000 0000 0000 0001变成0000 0000 0000 0100,即x=4

第三次循环:c++运算后c=3,   x=1<<c后0000 0000 0000 0001变成0000 0000 0000 1000,即x=8

.....................................................................................................................................

第13次循环:c++运算后c=13,   x=1<<c后0000 0000 0000 0001变成0010 0000 0000 0000,即x=8192

执行x<8848 ,8192<8848,符合循环条件,c++后c=14

第13次循环:c++运算后c=13,   x=1<<c后0000 0000 0000 0001变成0100 0000 0000 0000,即x=16384

不符合条件,循环结束,所以c=14
作者: 刘胜寒    时间: 2013-3-28 21:03
看到二楼的我就跪了!你这位运算你要学到什么程度你才可以收手啊!!楼主啊!跟二楼学一下位运算吧...二楼不要说你是Integer.toBinaryString()用这个方法算的哦??我会鄙视你的哦
作者: 陈腾跃_2013    时间: 2013-3-28 21:14
其实,就是左移运算符相当于乘2的运算的原理

也不要884800,太恐怖了,就用8做例子,且用do-while更好理解
  1. package cty.show;

  2. public class NumInputTest {

  3.         public static void main(String[] args)
  4.         {
  5.         int x =1;
  6.         int c=0;
  7.         do{
  8.            c++;
  9.            x=1<<c;
  10.         }while(x<8);
  11.         System.out.println(c);
  12.         }//条件x<8输出3 x<9输出4
  13. }
复制代码
第1次,c++等于1,相当于x=1*2;
第2次,c++等于2,x=1*2*2=4;
第3次,c++等于3,x=1*2*2*2=8;这时不满足x<8的条件,结束
作者: luguoyuanf    时间: 2013-3-28 21:34
首先我们要把这个程序的顺序搞清楚
c初始化是0,进入while之后c++=0+1
x=1<<1  也就是1的2进制 向左移动一位就是0000 0010 = 2,俩位就是0000 0100 =4
后面的以此类推 .
看到你的帖子让我想起了上课做的练习算一张纸0.01米后的纸折多少下可以比848米的喜马拉雅山高,最后得出来的结论是20,当时我们都很郁闷,哈哈
作者: 陈腾跃_2013    时间: 2013-3-29 00:37
luguoyuanf 发表于 2013-3-28 21:34
首先我们要把这个程序的顺序搞清楚
c初始化是0,进入while之后c++=0+1
x=1

原来楼主的8848是这么个来历,我还以为疯狂了!:lol
作者: luguoyuanf    时间: 2013-3-29 22:57
陈腾跃_2013 发表于 2013-3-29 00:37
原来楼主的8848是这么个来历,我还以为疯狂了!

一开始我也很郁闷,后来用计算器算了下还这是,嘿嘿




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2