Java位运算总结

关于二进制

关于二进制的概念,网上已经很多,这里不多赘述,只说关键的属性说明和示例。

维基百科

记住,原码是给人看的,补码才是计算机真正使用的。

我们一般所说的二进制是有32位,首位是符号位。0是正数,1是负数。下面我们来根据例子说明二进制与十进制的转换,以及原码补码反码的概念。

  • 二进制转10 进制(32位太长,我们省略我8位方便演示)

    规则:从后往前依次下标为0,1,2..n,如果位是1 则记2的下标次方,有多少个是1的都相加。最后根据符号位标示正负即可。

    • 示例1:0000 0011 的十进制是多少?

    (2的0次方)+(2的1次方)= +3

    • 示例2:1000 0011 的十进制是多少? 补码:1111 1101 -((2的0次方)+(2的1次方))= -3

对于正数来说,原码反码补码都一样。这里主要说的是负数。 以-3为例

  • 原码

1000 0011

  • 反码(原码0->1,1->0,保留符号位)

1111 1100

  • 补码 =反码+1000 00111(逢2进1)

1111 1101

位运算(以补码进行计算)

a=-3,b=2;

位与 & (位同为1,记1,否则记0)

  • 示例 a&b

a补码:1111 1101

b补码:0000 0010

结果: 0000 0000(正数补码反码一样) = 0

位或 | (位只要有1,则记1,否则记0)

  • 示例a|b

a补码:1111 1101

b补码:0000 0010

结果: 1111 1111(补码)

结果反码:1111 1110

结果原码:1000 0001(保留符号位)

结果= -1

位异或 ^ (位不一样则记1,否则记0)

  • 示例 a^b

a补码:1111 1101

b补码:0000 0010

结果: 1111 1111

结果反码:1111 1110(补码-1)

结果原码:1000 0001(保留符号位)

结果 = -1

位取反 ~ (位取反,1>0,0>1)

  • 示例 ~a

a补码:1111 1101

结果: 0000 0010

结果 = 2

左移 << 符号位不变,低位补0 (自右向左低到高)

  • 示例 a<<b

a补码:1111 1101

结果: 1111 0100

结果反码:1111 0011

结果原码:1000 1100(保留符号位)

结果 = -12

右移 >> 低位溢出,符号位不变,并用符号位补溢出的高位

  • 示例 a>>b

a补码:1111 1101

结果: 1111 1111

结果反码:1111 1110

结果原码:1000 0001(保留符号位)

结果 = -1

备注

以上内容在java环境中测试通过。不对之处还望指正。

最后

作者:ricky

交流群: 244930845

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值