日期:2014-05-20  浏览次数:20783 次

if(ch>>>8==0)与if(ch<=255)两句的区别?
如题,请高手们谈谈这两句的区别,我自己现在还觉得后一句效率比前句高,理由:后一句直接让变量ch与255做比较,而前一句还额外做了一次位移运算,然后才与0做比较。求各位大大教育!
java jdk 位移运算 效率

------解决方案--------------------
位运算的效率高的,你写ch<=255,首先要将255转换成二进制,再将ch转换成二进制,然后进行比较的,计算机里面存的都是二进制数据,这点应该知道的。
------解决方案--------------------
位运算的效率高         
------解决方案--------------------
引用:
且不管哪个效率更高(这样一个表达式的效率基本上可以忽略不计),但是我觉得第一种方法绝对是不可取的,可读性太差了。

这帖子里浑水摸鱼误导群众的太多,看不下去了。

这两个效率是完全一样的。

如果是直接写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必须优化为指令中的直接常量)。如果不然,第一个比第二个多了一条语句,反而可能会更差。

不过,根据实验,两者性能完全一样。

所以我不知道什么叫“转化为二进制”,跟<<运算的效率有什么关系,还有你是怎么被“一语惊醒梦中人”的。

------解决方案--------------------
引用:
哥们儿,你写了这么多,估计也没几个可以看懂的嘛,能用通俗点的语言说一下为啥不??????

简单地说,就是执行这两条语句所用的CPU时间完全相同,所以不存在快慢问题。
PS:我发了帖子不到3分钟你就回了,根本不是你看不看得懂的问题