https://blog.csdn.net/xiaochunyong/article/details/7748713
Java中位运算主要包括 & (与) |(或)~(非) ^ (异或 ) >> (左移) >>(右移) >>>(无符号右移)
首先java中int的取值范围为 2的31次方减一 到 负的 2的32次方之间 (整数最大为除符号位为0外 其他位全部为1 即20 + 21 + … + 230 根据累积公式 20(1-231)/(1-2))
首先来看一下 左移 右移 和无符号右移对数字产生的影响
在java中 int类型是32位整数 最高位0代表是正数 最高位为1代表是负数 正数是以原码的方式存在 负数是以补码的方式存在
例如 对于5 存在方式为 00000000 00000000 00000000 00000101
对于 -5 存在的方式首先最高位为1 减一并取反 11111111 11111111 11111111 11111011 (同理对于负数的二进制码转为十进制的时候对除符号位全部取反并加一)
在此基础上 如果对5 进行 << 左移操作 例如左移两位 5<<2 可得
00000000 00000000 00000000 00010100 相当于5* 2的平方 得20 左移之后低位补0
如果对5进行右移 因为右移会使得最侧需要填补 如果是普通右移 使用符号位进行填补
例如5 右移3位等于 00000000 00000000 00000000 00000000 等于0 其实相当于5除以2的三次方
对于 -5 右移3位 11111111 11111111 11111111 11111111 对除符号位外其他位取反加一 得 -1
如果对 -5 进行 无符号的右移 即左侧填充不论符号位是0还是1 都进行0 填充
得 00011111 11111111 11111111 11111111 等于536870911
注意在同时存在加减操作以及左移和右移操作的时候 系统会首先执行加减操作 然后再执行位运算操作
例如 1<< 31 -1 (相当于 1<<30)
同时 (1<< 31)-3 相当于 首先将00000000 000000000 00000000 00000001 左移31位 得到 10000000 00000000 00000000 00000000 等于负的2的32次方(因为除符号位取反 然后加一 )这时候再减3 减1得到 01111111 11111111 1111111 11111111 再减2 对于负数做减法的时候直接进行减法操作 如果涉及到在符号位进行借位 说明已经越界 直接将符号位借位并放置0 得到正数
总结 : 左移低位补0 右移高位补符号 无符号右移高位补0 负数反码加一 10000000 00000000 00000000 00000000 代表最大负数