JAVA源码阅读之----番外篇(位运算符详解,附带负数在内存中的存储方式)

在JAVA开发环境中,除了正常的逻辑运算符与数学运算符之外,还存在一种位运算符.
区别于逻辑运算与数学运算符,位运算符针对二进制进行操作.它们分别为:
&, |, ^, ~, >>, <<, >>>

&:
且的意思,即相同位的值均为1时,结果为1.
例如:3&5 计算过程
011 & 101 = 001, 结果为1 前两位不同时为1,所以为0,第三位同为1,结果为1

|:
或的意思,即相同位的值有一个为1时,结果为1.
例如:2|4 计算过程
010 & 100 = 110, 结果为6 前两位有一个为1结果位1,第三位均不为1结果为0

^:
异或的意思,当相同位置的值不同时,结果为1.
例如:3^2 计算过程
011 ^ 010 = 001, 结果为1 前两位相同结果为0,第三位不同结果为1

~:
讲这个运算符需要先讲负数
这里插一章,讲到取反,则这里讲一下负数在内存中存储的形式
负数的存储为一下步骤:
源码—>反码—>补码
取整数部分取反得到反码,然后+1得到补码即为负数在内存中存储的形式
例如:-5
5的源码为:0000 0000 == 0000 0000 == 0000 0000 == 0000 0101
5的反码为:1111 1111 ===1111 1111 === 1111 1111 === 1111 1010
5的补码为:1111 1111 ===1111 1111 === 1111 1111 === 1111 1011
所以最终-5存储在内存中的形式为
1111 1111=== 1111 1111=== 1111 1111=== 1111 1011

知道负数的存储形式,那么就比较好懂取反的意思,将数字进行取反操作,0赋值1,1赋值0.
例如:~9
即:1000 0000 0000 0000 0000 0000 0000 1001
取反结果为:
0111 1111 1111 1111 1111 1111 1111 0110

这里正数转负数 ~9 + 1
负数转正数 ~(-9 - 1)

<<:
带符号左移运算符,即将一个数的全部位数向左移动指定位,右侧补零
例如: 10 << 2
10 –> 0000 1010
10 << 2 —> 0010 1000
结果位32 + 8 = 40;

“>>”:
带符号右移动运算符,将一个数的全部位数向右移动指定位.
例如:10 >> 2
10–> 0000 1010
10 >> 2 –> 0000 0010
结果 10 >> 2 = 2

“>>>”:
无符号右移:
不带符号右移,将一个数的全部位向右移动指定
例如: 10 >>> 2
10 –> 0000 1010
10 >>> 2 —> 0000 0010
结果 10 >>> 2 = 2

移位运算符关于负数和超位数的情况:
这里以int 32位为例:
正数最大值为 : 2^31-1,负数最大值为 2^31.
为何负数范围比正数大一呢.这里以8位举例,因为0 用正数的00 00 00 00 表示了.而负数的10 00 00 00 应该也是表示0的,但是这里用来表示其它数了,那么表示了什么呢.取反得到 01 11 11 11,然后补位得到 10 00 00 00.so 这里表示为-128

这里其实正负数范围一样,因为正数有0,而负数没有.所以其实两则相同.

正数最大 7F FF FF FF 左移一位 得到 FF FF FF FE 首位为1,则减一取反得到 00 00 00 02,所以结果为-2
负数最大

你可能感兴趣的:(JAVA,源码阅读)