int x = 15 << -1;
int x = 15 >> -1;
int x = 15 >>> -1;
这三种位移操作符右边的操作数可以是负数吗,如果可以,它们的值要怎么计算?

解决方案 »

  1.   


    public static void main(String[] args) {
    int x = 15 << -1;
    int x2 = 15 >> -1;
    int x3 = 15 >>> -1;
    System.out.println(x);
    System.out.println(x2);
    System.out.println(x3);
    }
    打印结果
    -2147483648
    0
    0难以理解
      

  2.   

    那就看编译器怎么实现了
    当超出左移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)
      

  3.   

    可以是负数。对于 int 来说只取这个负数二进制的低 5 位,可以参考这个帖子:http://topic.csdn.net/u/20080621/17/23cb5242-12d0-4584-86b9-7483a305f5dd.html