`

探寻Java移位操作符

 
阅读更多

      最近在看《JAVA解惑》,看到移位操作符这一块感觉比较陌生,特意写一篇博客记录一下。

       由于int型数值占4个字节,所以它是2的32次方。由于32是2的5次方。而对于long型数值占8个字节,所以是2的64次方。由于64是2的6次方。

       结论:对于int型数值,移位操作符只使用其右操作数的低5位做为以为长度(移位长度介于0到31)。对于long型数值,移位操作符只使用其右操作数的低6位做为以为长度(移位长度介于0到63)

       看下面的程序:

                int count=0;
		int num=-1;
		for(int i=0;i<=32;i++){
			System.out.println(num<<i);
			System.out.println("count is:  "+(count++));
		}
//运行结果:
-1
count is:  0
-2
count is:  1
-4
count is:  2
-8
count is:  3
-16
count is:  4
-32
count is:  5
-64
count is:  6
-128
count is:  7
-256
count is:  8
-512
count is:  9
-1024
count is:  10
-2048
count is:  11
-4096
count is:  12
-8192
count is:  13
-16384
count is:  14
-32768
count is:  15
-65536
count is:  16
-131072
count is:  17
-262144
count is:  18
-524288
count is:  19
-1048576
count is:  20
-2097152
count is:  21
-4194304
count is:  22
-8388608
count is:  23
-16777216
count is:  24
-33554432
count is:  25
-67108864
count is:  26
-134217728
count is:  27
-268435456
count is:  28
-536870912
count is:  29
-1073741824
count is:  30
-2147483648
count is:  31
-1
count is:  32

   惊奇地发现若让int型数值移位32(-1<<32),竟然等于自身。

 

    但是如果这样:-2147483648<<1;    就会得到-1左移位32的结果。

 

       还有一点:会经常被误解就是:很多人会认为负移位长度的右移操作可以起到左移操作的作用。

    就是说对于  1>>-1,可能会被误认为是左移一位。

     事实是右移操作符总是起到右移的作用,而左移操作符总是起到左移操作符。负的移位长度只保留低5位而且去除其他位转换成正的移位长度。比如将一个int数值左移,移位长度是-1,那么移动效果就是它被左移了31位。

       对于int型数值,移动长度对32取余数,对于long型数值,移动长度对64取余数。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics