您的位置:首页 > 编程语言 > Java开发

JAVA中补码的运算;移位运算符

2010-11-28 17:16 225 查看
java 2009-02-18 15:06:06 阅读256 评论0 字号:大中小 订阅
JAVA中补码的运算(java中的int是4个字节的00000000 00000000 00000000 00000000)32位:
在这里就先知道原码与补码
原码就是由绝对值值换过来的值,如5:0000 0101,-5:1000 0101
补码在原码上做的修改:正数没什么两样,(正数原码、反码、补码都一样)
负数就有规则了:正数绝对值取反+1
如-5的补码:1111 1010+1=1111 1011
求:~(-1)
先求-1的补码:
1:00......1
-1:1取反:11111.....0+1=11111.....11111
再求反(~),按位求反:
0000000....000000000(即变为0了)
求~5:
5:
0000 0101
~5(取反):
1111 1010,由这数据可看出,是一个负数,负数求补有规则(绝对值原码取反+1),
那这个数应先-1再求反:
减1:1111 1010-1 = 1111 1001
求返:
0000 0110 = 6
由于最高位为1,即为负数:应为-6
所以~5值为-6
例子2:
int a = 0X1234;//0001 0010 0011 0100
int b = (~a)&0Xff;
int c=b^12;
~a:
0001 0010 0011 0100
取反:
1110 1101 1100 1011(最高位为1,即为负数-负数规则[绝对值原码取反+1],那这里就反计算了,先-1再取反得绝对值)
-1:
1110 1101 1100 1010
取反:
0001 0010 0011 0101
得值为:4661
由于最高位为1,即负数,应为-4661
-4661:
1110 1101 1100 1011
再&ff(1111 1111):
1110 1101 1100 1011
0000 0000 1111 1111
=
0000 0000 1100 1011=203
再^12(1100)
0000 0000 1100 1011
0000 0000 0000 1100
=
0000 0000 1100 0111=199

0的补码:0000 0000
1的补码:0000 0001
-1的补码:1000.... 1

Java使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。
补码的规定如下:
对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。
对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为11010110(00101010按位取反11010101+1=11010110)
0的补码是唯一的,都为 00000000。
现在分析你的
5补码为00000101
取反11111010,刚才说了,最高位表示符号,现在最高位是1,代表负数,负数怎么来的?绝对值取反,所以退回去就成了(也就是先求出绝对值就成了),
11111010-1=11111001,再反回去,00000110,所以这个绝对值是6,那么因为它是负数,所以是-6,明白?

以下内容 参考:http://www.blogjava.net/rosen/archive/2005/08/12/9955.html
请注意!引用、转贴本文应注明原作者:Rosen Jiang 以及出处:http://www.blogjava.net/rosen
移位运算符
包括:
">> 右移";"<< 左移";">>> 无符号右移"
例子:
-5>>3=-1
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1111 1111
其结果与 Math.floor((double)-5/(2*2*2)) 完全相同。
-5<<3=-40
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1101 1000
其结果与 -5*2*2*2 完全相同。
5>>3=0
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0000
其结果与 5/(2*2*2) 完全相同。
5<<3=40
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0010 1000
其结果与 5*2*2*2 完全相同。
-5>>>3=536870911
1111 1111 1111 1111 1111 1111 1111 1011
0001 1111 1111 1111 1111 1111 1111 1111
无论正数、负数,它们的右移、左移、无符号右移 32 位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5。
一个有趣的现象是,把 1 左移 31 位再右移 31 位,其结果为 -1。
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111
位逻辑运算符
包括:
& 与;| 或;~ 非(也叫做求反);^ 异或
"& 与"、"| 或"、"~ 非"是基本逻辑运算,由此可以演变出"与非"、"或非"、"与或非"复合逻辑运算。"^ 异或"是一种特殊的逻辑运算,对它求反可以得到"同或",所以"同或"逻辑也叫"异或非"逻辑。
例子:
5&3=1
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0001
-5&3=1
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0011
5|3=7
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0111
-5|3=-5
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
~5=-6
0000 0000 0000 0000 0000 0000 0000 0101
1111 1111 1111 1111 1111 1111 1111 1010
~-5=4
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0100
5^3=6
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0110
-5^3=-8
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: