java解惑之移位操作

public class Shifty {

public static void main(String[] args) {

Int i = 0;

while (-1 << i != 0)

i++;

System.out.println(i);

}

}

常量-1 是所有32 位都被位的int 数值(0xffffffff)。左操作符将0 移入位所的最位,因此表达式(-1 << i)将i 的位设置0,并保持其余的32 - i 位为1。很显,这个环将完成32 代,因为-1 << i 对任何32 i 来说都不等于0。你可能期望件测试在i 等于32 时返回false而使程序打印32,但是它打印的并不是32上,它不会打印任何东西,而是了一个无环。

条规则作用于位操作符:<<>>>>>长度是对32取余的,所以总是0 31 之间;如果左操作数是long 型的,64 取余,0 63 之间。如果试图对一个int 数值32 位,或是对一个long 数值64 位,都只能返回这个数值的值。有任何长度可以一个int 数值丢弃其所有的32 位,或一个long数值丢弃其所有的64 位。

-1 << 32 == -1

如果可能的话,移位长度应该是常量。如果移位长度紧盯着你不放,那么你让其值超过31,或者如果左操作数是long类型的,让其值超过63 的可能性就会大大降低。当然,你并不可能总是可以使用常量的移位长度。当你必须使用一个非常量的移位长度时,请确保你的程序可以应付这种容易产生问题的情况,或者压根就不会碰到这种情况。

很多程序员都希望具有负的移位长度的右移操作符可以起到左移操作符的作用,反之亦然。但是情况并非如此。右移操作符总是起到右移的作用,而左移操作符也总是起到左移的作用。总之,移位长度是对32 取余的,或者如果左操作数是long 类型的,则对64 取余。因此,使用任何移位操作符和移位长度,都不可能将一个数值的所有位全部移走。同时,我们也不可能用右移操作符来执行左移操作,反之亦然。如果可能的话,请使用常量的移位长度,如果移位长度不能设为常量,那么就要千万当心。
    转载自: 无码团队blog-wuma.koubei.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值