笔试总结----位运算

本文详细介绍了Java中位运算的使用,包括与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)和无符号右移(>>>). 重点解析了不同位移操作对正数和负数的影响,以及在运算顺序上的规则。特别强调了左移补0、右移补符号位、无符号右移补0的特性,并通过实例展示了位运算在数值计算中的应用。
摘要由CSDN通过智能技术生成

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 代表最大负数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值