对于Thinking In Java中byte,short无符号右移的理解

拜读Thinking In Java看到以下内容

若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。

//对于上面的话 可以看成移动的实际位数 是 给定的移动位数%数据类型的位数

eg.

*int x = 100;
*    x << 35;//结果是800

*a:1100100//二进制补码

*35:100011//二进制补码,int类型取5个低位00011即3(相当于35%32=3)

*结果:1100100000//800

但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。可用下面这个例子检测自己的实现方案:

//

//: URShift.java
// Test of unsigned right shift

public class URShift {
  public static void main(String[] args) {
    int i = -1;
    i >>>= 10;
    System.out.println(i);//4194303
    long l = -1;
    l >>>= 10;
    System.out.println(l);//18014398509481983
    //上面两个好理解
    short s = -1;
    s >>>= 10;
    System.out.println(s);//-1
    byte b = -1;
    b >>>= 10;
    System.out.println(b);//-1
    //这两句不理解然后写了下面一段代码
  }
} ///:~

                for (int i = 1; i < 32; i++) {
			byte s = -1;
			s >>>= i;
			System.out.println(i + " " + s);
//结果是:1 -1 2 -1 3 -1 4 -1 5 -1 6 -1 7 -1 8 -1 9 -1 10 -1 11 -1 12 -1 13 -1 14 -1 15 -1 16 -1 17 -1 18 -1 19 -1 20 -1 21 -1 22 -1 23 -1 24 -1 //25 127 26 63 27 31 28 15 29 7 30 3 31 1 //为了省版面好乱 就是直到>>>25  s的结果才不再是-1
			// System.out.println(Integer.toBinaryString(s));
		}

想了想觉得应该是>>>= 这个写法的事 于是又写了以下

byte s = -1;
int ss = s >>> i;
System.out.print(i + " " + ss + " ");
//结果是:1 2147483647 2 1073741823 3 536870911 4 268435455 5 134217727 6 67108863 7 33554431 8 16777215 9 8388607 10 4194303 11 2097151 12 1048575 13 524287 14 262143 15 131071 16 65535 17 32767 18 16383 19 8191 20 4095 21 2047 22 1023 23 511 24 255 25 127 26 63 27 31 28 15 29 7 30 3 31 1 
这就很明显了 s>>>=i; 此时s是byte类型>>>1到24的值(int)都超过byte的取值范围了.btw 如果是short类型 s>>>i在i=17时开始17 32767 18 16383 19 8191 20 4095 21 2047 22 1023 23 511 24 255 25 127 26 63 27 31 28 15 29 7 30 3 31 1 

s=(short)(s>>>10);//就酱

怪不得网上没找到解答,原来这么简单新手在此记录下!


你可能感兴趣的:(随笔)