搜索

首页  >  问答  >  正文

关于java的逻辑移位和算数移位

关于java中的移位,例如

int a=-8;
System.out.println(a>>>33);//2147483644
System.out.println(a>>>1); //2147483644

这里我采用了逻辑右移(无符号右移)为例,对-8进行逻辑右移,移动33位和移动1位的效果是一样的,其原因是移动33位时对其进行取模操作(与32相除的余数),对其余数进行移位,请问Java中这样设计的理由是什么?为什么不是当逻辑右移超过32位时,其结果应该为0,这样不是更符合常理吗?

PHPzPHPz2888 天前393

全部回复(3)我来回复

  • 巴扎黑

    巴扎黑2017-04-17 17:42:08

    我看到有人质疑我的答案,所以来改了下

    楼主所说的 为什么 移位33 为不直接置 0 ?
    因为如果按照这种方式去运作,首先简单的代码会出现很多魔数~因为我移位33 也可以为 0,移位34 也可以为0....
    这样一来就没有标准了,然后是移位操作也是要一步步执行的(保存值,然后运算,如此循环),这种无下限的移动肯定是计算机,还是设计语言的人都无法接受!!!!

    *移位操作说白了就是底层的相乘2 相除2,首先我要说的观点!没有一个非0的数除以2^n会得到0,稍微知道数学的人应该很容易就能够想到,为什么再1 >> 1的时候会得到 0 的结果???因为位操作只针对整数,这跟直接使用1/2 为 0 而不是为 0.5是一个概念。

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:42:08

    移位操作由于其高效率,常被用来优化*/法,向左移一位相当于*2,向右移一位相当于/2。当然,这是在一定范围条件内的。*/法,向左移一位相当于*2,向右移一位相当于/2。当然,这是在一定范围条件内的。

    至于>>>33位这样的不合理的移位,取模操作后才去进行移位,是一种可选方案吧?应该另有它用,比如在进行一些特殊算法(如MD5
    至于>>>33位这样的不合理的移位,取模操作后才去进行移位,是一种可选方案吧?应该另有它用,比如在进行一些特殊算法(如MD5加密算法)。至于1楼所解释的,我不能认同。移位和乘除对等

    是需要范围条件的,这个作为程序员应该在使用时注意。个人觉得,java移位操作已经有C的一些特点,是一种面向底层的操作,需要程序员有一定基础功底才能运用好。🎜

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 17:42:08

    你一次移位超过类型的最大长度以得到0,为什么不直接置为0呢?

    回复
    0
  • 取消回复