Java-位运算符

前言:

原码、反码、补码(重点 难点,全部背熟)

  1. 二进制的最高位是符号位: 0表示正数,1表示负数 (口诀: 0 —> 0 1—> -)
  2. 正数的原码、反码、补码都一样
  3. 负数的反码 = 它的原码符号位不变,其他位取反 (0—>1,1—>0)
  4. 负数的补码 = 它的反码 + 1 , 负数的反码 = 负数的补码 -1
  5. 0的反码、补码都是0
  6. Java没有无符号数,换言之,java中的数都是有符号的
  7. 在计算机运算的时候,都是以补码的方式来运算的
  8. 当我们看运算结果的时候,要看他的原码(!!)

一、位运算符1

位运算符1

  • Java中有7个位运算(&、|、^、~、>>、<<和 >>>)
    • 分别是按位与&、按位或|、按位异或^、按位取反~、它们的运算规则是:
    • 按位与& : 两位全为1,结果为1,否则为0
    • 按位或| : 两位有一个位1,结果为1,否则为0
    • 按位异或 : 两位一个为0,一个为1,结果为1,否则为0
    • 按位取反~ : 0—> 1 , 1—> 0

案例一:

2 & 3 = 2

运算过程如下:

2的原码: 00000000 00000000 00000000 00000010

3的原码: 00000000 00000000 00000000 00000011

2的补码: 00000000 00000000 00000000 00000010

3的补码: 00000000 00000000 00000000 00000011

2 & 3的补码 : 00000000 00000000 00000000 00000010 

2 & 3的原码: 00000000 00000000 00000000 00000010 

所以:  2 & 3 = 2

案例二: 

~-2 = 1

运算过程如下:

-2的原码: 10000000 00000000 00000000 00000010

-2的反码: 11111111  11111111   111111111  11111101

-2的补码:  11111111  11111111   11111111    11111110

~-2的补码:00000000 00000000 00000000  00000001

~-2的原码: 00000000 00000000 00000000  00000001

所以: ~-2 = 1

案例三:

~2 = -3

运算过程如下:

2的原码 : 00000000 00000000 00000000 00000010

2的补码 : 00000000 00000000 00000000 00000010

~2的补码: 11111111  11111111  11111111   11111101

~2的反码 : 11111111  11111111  11111111   11111100

~2的原码: 10000000  00000000 00000000 00000011

所以: ~2 = -3

案例四:

2 | 3 = 3

2的原码: 00000000 00000000 00000000 00000010

3的原码: 00000000 00000000 00000000 00000011

2的补码: 00000000 00000000 00000000 00000010

3的补码: 00000000 00000000 00000000 00000011

2 | 3的补码: 00000000 00000000 00000000 00000011

2 | 3的原码: 00000000 00000000 00000000 00000011

所以: 2 | 3 =3

案例五: 

2 ^ 3 = 1

2的原码: 00000000 00000000 00000000 00000010

3的原码: 00000000 00000000 00000000 00000011

2的补码: 00000000 00000000 00000000 00000010

3的补码: 00000000 00000000 00000000 00000011

2 ^ 3的补码: 00000000 00000000 00000000 00000001

2 ^ 3的原码: 00000000 00000000 00000000 00000001

所以: 2 ^ 3 = 1 

二、位运算符2

  • Java中还有3个位运算符 >> 、 << 和 >>>, 运算规则:
    1. 算术右移 >> : 低位溢出,符号位不变,并用符号位补溢出的高位
    2. 算术左移 << : 符号位不变,低位补0
    3. >>> 逻辑右移也叫无符号右移,运算规则是 : 低位溢出,高位补0
    4. 特别说明 : 没有 <<< 符号

案例六

int a = 1 >> 2

1的原码 : 00000000 00000000 00000000 00000001

1的补码 : 00000000 00000000 00000000 00000001

1 >>2 的补码 : 00000000 00000000 00000000 00000001 —> 00000000 00000000 00000000 00000000 等价于→ 00000000 本质就是1 / 2 / 2 (也就是每向右移1位,就除以2,这里1向右移2位 = 1/2/2 = 0)

1 >>2 的原码 : 00000000 00000000 00000000 00000001 —> 00000000 00000000 00000000 00000000

所以 1 >> 2 = 0

案例七: 

int c = 1 << 2

1的原码 : 00000000 00000000 00000000 00000001

1的补码 : 00000000 00000000 00000000 00000001

1 << 2的补码: 00000000 00000000 00000000 00000001 —>00000000 00000000 00000000 00000100

  • 00000100 本质就是1 * 2 * 2(也就是每向左移1位,就乘以2,这里1向左移2位 = 1 * 2 * 2 = 4)

1 << 2的原码: 00000000 00000000 00000000 00000001 —>00000000 00000000 00000000 00000100 等价于—> 00000100

所以 1 << 2 = 4

案例八: 

int d = 4 >> 3

4的原码: 00000000 00000000 00000000 00000100

4的补码: 00000000 00000000 00000000 00000100

4 << 3的补码: 00000000 00000000 00000000 00000100—> 00000000 00000000 00000000 00100000

  • 00100000 本质就是 4 * 2 * 2 * 2 =32 (也就是每向左移1位,就乘以2,这里4向左移3位 = 4 * 2 * 2 * = 32)
  • 4 << 3的补码: 00000000 00000000 00000000 00000100—> 00000000 00000000 00000000 00100000
  • 所以: 4 >> 3 =32
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值