一、基础知识
二、实例解析(重点)
三、参考文章
一、原码、补码、反码
http://baike.baidu.com/view/742694.htm
Thinking In Java
3.1.8 移位运算符
移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符(<<)能将运算符左边的运算对象
向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。
“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),
它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。
二、PS::(实例解析)
System.err.println("-20 >> 3===" + (-20 >> 3));//两次取补32位
System.err.println("20 >> 3===" + (20 >> 3)); //2 (20/8=2)
System.err.println(("-20 << 3==")+ (-20 << 3)); //两次取补32位
System.err.println("20 << 3==" + (20 << 3)); //160 (20*8=160)
System.err.println("-20 >>> 3===" + (-20 >>> 3)); //一次取补,移位,结果
System.err.println("20 >>> 3===" + (20 >>> 3)); //2 (20/8=2)
//sepcial
System.err.println("-1 << 10===" + (-1 << 10));//两次取补32位
System.err.println("-1 << 24===" + (-1 << 24));//两次取补32位
System.err.println("-1 >> 10" + (-1 >> 10));
System.err.println("-1 >> 24" + (-1 >> 24));
System.err.println("-20 >> 10==" + (-20 >> 10)); 两次取补32位
P.p("-----" + (4 >> 3));
System.out.println("=====" + (-1 >>> 1));
}
}
/*
* 11111000 –8 >>1 11111100 –4
1、求-8的补码(反码+1)==>11111000
2、移位(>>1)去掉右边最后一位,在左边+1(因为是负数)==>1111 1100(最高位为1,值为负)
3、再求补码(反码+1)
*/
/**
int a = -1; a = a >>> 24;
下面用二进制形式进一步说明该操作:
11111111 11111111 11111111 11111111 int型-1的二进制代码>>> 24
无符号右移24位00000000 00000000 00000000 11111111 int型255的二进制代码
*/
/*
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
右移一位相当于除2,右移n位相当于除以2的n次方。
对于正数来说和带符号右移相同,对于负数来说不同。
*/
/*
System.err.println("-1 << 10===" + (-1 << 10));//两次取补32位
1、1的原码:00000000 00000000 00000000 00000001
2、1的补码: 11111111 11111111 11111111 11111111 (原码=反码+1)
3、 11111111 11111111 11111100 00000000 (左移10位,低位补0,最高位为1,值为负)
4、 00000000 00000000 00000011 11111111 ==>(+1)
00000000 00000000 00000100 00000000 ==>1*2^10=1024 结果为-1024 (第三步结果的补码)
*/
-8 >> 1
/*
* 11111000 –8 >>1 11111100 –4
1、求-8的补码(反码+1)==>11111000
2、移位(>>1)去掉右边最后一位,在左边+1(因为是负数)==>1111 1100(最高位为1,值为负)
3、再求补码(反码+1)
*/
三、Reference:
http://wenku.baidu.com/view/a7b747a2284ac850ad024276.html
http://zhidao.baidu.com/question/318286286.html
http://blog.163.com/zh_y_yang/blog/static/181552412201132685034960/
http://jinguo.iteye.com/blog/540150
think in java