Java二进制-补码,左移,右移,无符号右移

一、二进制

  • 二进制的最高位是符号位(整数是0,负数是1
  • Java中没有无符号数
  • 计算机以整数的补码进行计算

原码:将一个整数转换为二进制

以int类型为例,int类型在Java中是4个字节,32位
例如:

2 的原码:00000000 00000000 00000000 00000010

-2的原码:10000000 00000000 00000000 00000010

反码

正数的反码:与原码相同

负数的反码:符号位不变,其它位取反
例如:

-2的反码:11111111 11111111 11111111 11111101

补码

正数的补码:与原码相同

负数的补码:反码+1

例如:

-2 的补码为:01111111 11111111 11111111 11111110

二、位运算

Java中有4个位运算符:

1. 按位与 &:两位都为1,结果为1

例如,2&3 = 2

2 的原码为: 00000000 00000000 00000000 00000010

3 的原码为: 00000000 00000000 00000000 00000011

2&3 原码为: 00000000 00000000 00000000 00000010 = 2

2. 按位或 |:至少一位为1,结果为1

例如,2|3 = 3

2 的原码为: 00000000 00000000 00000000 00000010

3 的原码为: 00000000 00000000 00000000 00000011

2|3 原码为: 00000000 00000000 00000000 00000011 = 3

3. 按位异或 ^:两位一个为1、一个为0,结果为1

例如,2|3 = 3

2 的原码为: 00000000 00000000 00000000 00000010

3 的原码为: 00000000 00000000 00000000 00000011

2^3 原码为: 00000000 00000000 00000000 00000001 = 1

4. 按位取反 ~:0变成1、1变成0

例如,~2 = -3

对2的原码取反:11111111 11111111 11111111 11111101 (取反后结果的补码,也就是-3的补码。我们需要从补码推出原码,才能得到-3)

  转换成反码:    11111111 11111111 11111111 11111100 (补码减1)

转换成原码: 10000000 00000000 00000000 00000011 =-3 (符号为不变,其他位取反)

三、移位

左移<<

  • 左移的规则只记住一点:丢弃高位,低位空位补0
  • 移动的位数超过了该类型的最大位数编译器会对移动的位数取模。比如int类型移动33位,实际移动1位
  • 左移n位就相当于乘以2的n次方

例如

3 <<2(3为int型)
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 1100

右移>>

  • 符号位不变,左边补上符号位
  • 右移一位相当于除2,右移n位相当于除以2的n次方

例如

11 >>2(11为int型)
0000 0000 0000 0000 0000 0000 0000 1011
0000 0000 0000 0000 0000 0000 0000 0010

无符号右移>>>

value >>> num

num 指定要移位值value 移动的位数。

无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位

总结

  1. 正数的原码、反码、补码都一样;
  2. 负数的反码 = 原码的符号位不变,其他位取反;
  3. 负数的补码 = 反码+1;
  4. 0的原码、反码、补码都是0;
  5. 计算机以补码进行运算;
  6. 取反不同于反码;

参考链接:https://www.cnblogs.com/blog-cq/p/5793529.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值