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

位移操作
int x = 15 << -1;
int x = 15 >> -1;
int x = 15 >>> -1;


这三种位移操作符右边的操作数可以是负数吗,如果可以,它们的值要怎么计算?

------解决方案--------------------
那就看编译器怎么实现了
当超出左移int的范围时,会循环回到右边
也就是说
int x = 15 << 32; //x == 15
int y = 15 << 33; //y == 15 << 1
a << b 等价于 a << (b%32)

同时,根据这个32位一个周期循环,可以知道
a << -b 等价于 a << (-b%32)+32

所以
int x = 15 << -1; 等价于 int x = 15 << (-1 + 32)
int x = 15 >> -1; 等价于 int x = 15 >> (-1 + 32)
int x = 15 >>> -1; 等价于 int x = 15 >>> (-1 + 32)