黑马程序员技术交流社区

标题: java语言中位移运算遇到的麻烦 [打印本页]

作者: xiaguangcheng    时间: 2014-11-16 10:12
标题: java语言中位移运算遇到的麻烦
相信大多数和我一样,在学到位移运算的时候,都回去被位移运算的简洁所折服。尤其是当老师讲到2乘以8的最快捷算法时,如果不是刚学了位移运算,很难想到还有“2<<3"这样的算法。下面两道题本人就试着用位移运算来处理,一道处理成功了,一道处理结果不对,不知道为什么?是不是位移运算只能处理整数?
珠穆朗玛峰高8848m,设一张纸的厚度0.01m,纸张折叠几次能够达到此高度?
第一种方法:用的就是位移:
  1. for(int x=1;x<32;x++){//由于1在int型,因此x最大可以左移32位   .
  2.                             if((1<<x)>884900){                     
  3.                                      System.out.println(x);
  4.                                      break;
  5.                             }
  6.                    }
复制代码

第二种方法:
  1. int start =1;
  2.                             int end=884900;
  3.                             int count=0;
  4.                             while(start<end){
  5.                                      start*=2;
  6.                                      count++;
  7. }
  8.                             System.out.println(count);
复制代码
上面这道题就体现除了位移运算的便捷性。昨天晚上做了一道阳哥的题目,发现这道题目也可以用位移来做题目如下:
第二题:
一个球从100米高处落下,第一次反弹回50米高,第二次反弹为第一次反弹高度的一半,求第十次反弹的高度。
第一种方法,传统的算法:
  1. double s=100/Math.pow(2,10);
复制代码
第二种方法,位移算法:
  1. double s=100>>10;
复制代码
第二种算法结果不对,不知道为什么?求大神指教?




作者: OCTSJimmy    时间: 2014-11-16 10:19
浮点数的二进制表示方法与整数的二进制表示方法差别很大,所以,浮点数不建议使用位移计算。
作者: xiaguangcheng    时间: 2014-11-16 10:22
OCTSJimmy 发表于 2014-11-16 10:19
浮点数的二进制表示方法与整数的二进制表示方法差别很大,所以,浮点数不建议使用位移计算。 ...

谢谢,那如果想用位移该怎么办呢?
作者: OCTSJimmy    时间: 2014-11-16 10:25
刚刚查了下资料,貌似不少语言的位移操作都是针对整型而言的,因此在做位移时,系统自动强制转化为了整数……
实在想对浮点位移,那就可以先将小数变为整数,接着位移后再变回去,可是这就违背了楼主需要简化操作的初衷了……

暂时没法子……
作者: 奋斗的蜗牛ksd    时间: 2014-11-17 00:19
本帖最后由 奋斗的蜗牛ksd 于 2014-11-17 00:25 编辑

位移的本质是 底层 二进制数字的运算,每次运算的结果,都默认取整,浮点数二进制 运算很复杂的,有局限性
作者: 奋斗的蜗牛ksd    时间: 2014-11-17 00:22
如果非要用位移,把浮点型改成整形试试看。但是误差会很大的。位移是有局限的。
作者: xiaguangcheng    时间: 2014-11-17 20:30
奋斗的蜗牛ksd 发表于 2014-11-17 00:19
位移的本质是 底层 二进制数字的运算,每次运算的结果,都默认取整,浮点数二进制 运算很复杂的,有局限性 ...

谢谢了,大致了解了,位移运算处理小数貌似很紧张
作者: 奋斗的蜗牛ksd    时间: 2014-11-17 23:23
xiaguangcheng 发表于 2014-11-17 20:30
谢谢了,大致了解了,位移运算处理小数貌似很紧张

不客气。 记住 简洁得总会有局限的,什么与什么不可兼得!




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