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

解决方案 »

  1.   

    ch是char类型的话 也要转换 
      

  2.   

    位运算的效率高的,你写ch<=255,首先要将255转换成二进制,再将ch转换成二进制,然后进行比较的,计算机里面存的都是二进制数据,这点应该知道的。
      

  3.   

    +1
    有一个经典的面试题,不知道楼主看过没有:用最有效率的方法算出2乘以8等于几?
    答案是:2<<3。
    和这个一样,计算机是二进制的,不管多大的数都要先转为二进制才能计算
      

  4.   

    这帖子里浑水摸鱼误导群众的太多,看不下去了。这两个效率是完全一样的。如果是直接写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必须优化为指令中的直接常量)。如果不然,第一个比第二个多了一条语句,反而可能会更差。不过,根据实验,两者性能完全一样。所以我不知道什么叫“转化为二进制”,跟<<运算的效率有什么关系,还有你是怎么被“一语惊醒梦中人”的。
      

  5.   

    这帖子里浑水摸鱼误导群众的太多,看不下去了。这两个效率是完全一样的。如果是直接写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必须优化为指令中的直接常量)。如果不然,第一个比第二个多了一条语句,反而可能会更差。不过,根据实验,两者性能完全一样。所以我不知道什么叫“转化为二进制”,跟<<运算的效率有什么关系,还有你是怎么被“一语惊醒梦中人”的。
    哥们儿,你写了这么多,估计也没几个可以看懂的嘛,能用通俗点的语言说一下为啥不??????
      

  6.   

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

  7.   

    简单地说,就是执行这两条语句所用的CPU时间完全相同,所以不存在快慢问题。
    PS:我发了帖子不到3分钟你就回了,根本不是你看不看得懂的问题呵呵,说实话,汇编我一点也看不懂计算机原理方面我是小白,呵呵