if(ch>>>8==0)与if(ch<=255)两句的区别?

金兄 2013-07-18 04:55:26
如题,请高手们谈谈这两句的区别,我自己现在还觉得后一句效率比前句高,理由:后一句直接让变量ch与255做比较,而前一句还额外做了一次位移运算,然后才与0做比较。求各位大大教育!
...全文
501 16 打赏 收藏 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
金兄 2013-07-31
  • 打赏
  • 举报
回复
感谢大家,看了大家的回复我有了思考和学习的方向,多谢多谢!
  • 打赏
  • 举报
回复
引用 14 楼 lcf 的回复:
[quote=引用 13 楼 hjw506848887 的回复:] 哥们儿,你写了这么多,估计也没几个可以看懂的嘛,能用通俗点的语言说一下为啥不??????
简单地说,就是执行这两条语句所用的CPU时间完全相同,所以不存在快慢问题。 PS:我发了帖子不到3分钟你就回了,根本不是你看不看得懂的问题[/quote]呵呵,说实话,汇编我一点也看不懂。。。计算机原理方面我是小白,呵呵。。。
lcf 2013-07-19
  • 打赏
  • 举报
回复
引用 13 楼 hjw506848887 的回复:
哥们儿,你写了这么多,估计也没几个可以看懂的嘛,能用通俗点的语言说一下为啥不??????
简单地说,就是执行这两条语句所用的CPU时间完全相同,所以不存在快慢问题。 PS:我发了帖子不到3分钟你就回了,根本不是你看不看得懂的问题
  • 打赏
  • 举报
回复
引用 12 楼 lcf 的回复:
[quote=引用 10 楼 rumlee 的回复:] 且不管哪个效率更高(这样一个表达式的效率基本上可以忽略不计),但是我觉得第一种方法绝对是不可取的,可读性太差了。
这帖子里浑水摸鱼误导群众的太多,看不下去了。 这两个效率是完全一样的。 如果是直接写x86汇编,分析一下是这样 ch >>> 8 #一条mov (load ch),一条unsigned shift指令,2个CPU cycle == 0 #一条jz (jump if zero),1个CPU cycle 总数3个 ch <= 255 #一条mov (load ch),一条cmp(比较ch和255),一条jg (jump if greater) 同样3个CPU cycle 看Java ByteCode,是这样 if ((ch >>> 8) == 0) { } ILOAD 2 # 加载变量 ch BIPUSH 8 # 加载常量 8 IUSHR # 对上述两个操作符进行bit shift IFNE L2 # 比较如果不是0就跳转 if (ch <= 255) { } ILOAD 2 # 加载ch SIPUSH 255 #加载255 IF_ICMPGT L3 #比较如果不是大于等于关系就跳转 JVM能做的最好的情况就是和我之前汇编语言分析一样(255和8必须优化为指令中的直接常量)。如果不然,第一个比第二个多了一条语句,反而可能会更差。 不过,根据实验,两者性能完全一样。 所以我不知道什么叫“转化为二进制”,跟<<运算的效率有什么关系,还有你是怎么被“一语惊醒梦中人”的。 [/quote]哥们儿,你写了这么多,估计也没几个可以看懂的嘛,能用通俗点的语言说一下为啥不??????
lcf 2013-07-19
  • 打赏
  • 举报
回复
引用 10 楼 rumlee 的回复:
且不管哪个效率更高(这样一个表达式的效率基本上可以忽略不计),但是我觉得第一种方法绝对是不可取的,可读性太差了。
这帖子里浑水摸鱼误导群众的太多,看不下去了。 这两个效率是完全一样的。 如果是直接写x86汇编,分析一下是这样 ch >>> 8 #一条mov (load ch),一条unsigned shift指令,2个CPU cycle == 0 #一条jz (jump if zero),1个CPU cycle 总数3个 ch <= 255 #一条mov (load ch),一条cmp(比较ch和255),一条jg (jump if greater) 同样3个CPU cycle 看Java ByteCode,是这样 if ((ch >>> 8) == 0) { } ILOAD 2 # 加载变量 ch BIPUSH 8 # 加载常量 8 IUSHR # 对上述两个操作符进行bit shift IFNE L2 # 比较如果不是0就跳转 if (ch <= 255) { } ILOAD 2 # 加载ch SIPUSH 255 #加载255 IF_ICMPGT L3 #比较如果不是大于等于关系就跳转 JVM能做的最好的情况就是和我之前汇编语言分析一样(255和8必须优化为指令中的直接常量)。如果不然,第一个比第二个多了一条语句,反而可能会更差。 不过,根据实验,两者性能完全一样。 所以我不知道什么叫“转化为二进制”,跟<<运算的效率有什么关系,还有你是怎么被“一语惊醒梦中人”的。
  • 打赏
  • 举报
回复
引用 10 楼 rumlee 的回复:
且不管哪个效率更高(这样一个表达式的效率基本上可以忽略不计),但是我觉得第一种方法绝对是不可取的,可读性太差了。
赞成!!!开发项目时也没谁没事吃饱了这么写。这种也就是出在面试题中,主要看你对计算机的原理设计的了解多少。。。
rumlee 2013-07-19
  • 打赏
  • 举报
回复
且不管哪个效率更高(这样一个表达式的效率基本上可以忽略不计),但是我觉得第一种方法绝对是不可取的,可读性太差了。
nextseconds 2013-07-19
  • 打赏
  • 举报
回复
引用 4 楼 hjw506848887 的回复:
[quote=引用 2 楼 qq1145174853 的回复:] 位运算的效率高的,你写ch<=255,首先要将255转换成二进制,再将ch转换成二进制,然后进行比较的,计算机里面存的都是二进制数据,这点应该知道的。
+1 有一个经典的面试题,不知道楼主看过没有:
用最有效率的方法算出2乘以8等于几?
答案是:2<<3。
和这个一样,计算机是二进制的,不管多大的数都要先转为二进制才能计算。。。。。。[/quote] 哥们的回答很有创意,赞一个!
lkq_david 2013-07-19
  • 打赏
  • 举报
回复
引用 7 楼 Artjsk 的回复:
[quote=引用 2 楼 qq1145174853 的回复:] 位运算的效率高的,你写ch<=255,首先要将255转换成二进制,再将ch转换成二进制,然后进行比较的,计算机里面存的都是二进制数据,这点应该知道的。
一语惊醒梦中人啊,谢谢。[/quote] 求给分,给高分!!
金兄 2013-07-19
  • 打赏
  • 举报
回复
引用 2 楼 qq1145174853 的回复:
位运算的效率高的,你写ch<=255,首先要将255转换成二进制,再将ch转换成二进制,然后进行比较的,计算机里面存的都是二进制数据,这点应该知道的。
一语惊醒梦中人啊,谢谢。
lcf 2013-07-18
  • 打赏
  • 举报
回复
这里的讨论越来越像这不可思议的方向发展了
oh_Maxy 2013-07-18
  • 打赏
  • 举报
回复
引用 楼主 Artjsk 的回复:
如题,请高手们谈谈这两句的区别,我自己现在还觉得后一句效率比前句高,理由:后一句直接让变量ch与255做比较,而前一句还额外做了一次位移运算,然后才与0做比较。求各位大大教育!
第一个,移位8下 第二个,将ch转二进制后比较
  • 打赏
  • 举报
回复
引用 2 楼 qq1145174853 的回复:
位运算的效率高的,你写ch<=255,首先要将255转换成二进制,再将ch转换成二进制,然后进行比较的,计算机里面存的都是二进制数据,这点应该知道的。
+1 有一个经典的面试题,不知道楼主看过没有:
用最有效率的方法算出2乘以8等于几?
答案是:2<<3。
和这个一样,计算机是二进制的,不管多大的数都要先转为二进制才能计算。。。。。。
qee_wong 2013-07-18
  • 打赏
  • 举报
回复
位运算的效率高
lkq_david 2013-07-18
  • 打赏
  • 举报
回复
位运算的效率高的,你写ch<=255,首先要将255转换成二进制,再将ch转换成二进制,然后进行比较的,计算机里面存的都是二进制数据,这点应该知道的。
忆忘浮夸 2013-07-18
  • 打赏
  • 举报
回复
ch是char类型的话 也要转换

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧