首页 > 关于java的逻辑移位和算数移位

关于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,这样不是更符合常理吗?


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

至于>>>33位这样的不合理的移位,取模操作后才去进行移位,是一种可选方案吧?应该另有它用,比如在进行一些特殊算法(如MD5加密算法)。
至于1楼所解释的,我不能认同。移位和乘除对等是需要范围条件的,这个作为程序员应该在使用时注意。个人觉得,java移位操作已经有C的一些特点,是一种面向底层的操作,需要程序员有一定基础功底才能运用好。


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

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

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


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

【热门文章】
【热门文章】