原码补码反码运算

1. 运算符

~ 取反
>> 左移
<< 右移
>>> 无符号右移
& 与
| 或
^ 异或

2. 运算注意

~ & ^ | 中不管是正数还是负数全部转成二进制的补码进行运算

求原码 反码 补码时,符号位不变

对于正数,反码=原码=补码
对于负数,符号位不变,反码=原码取反,补码=反码+1

+=

a += 1,+= 不提升数据类型
a = a + 1,提升数据类型

对于左移和右移

正数:左移和右移均补0
负数:左移补0,右移补1
无符号右移:不区分正数和负数,高位全用0补充

3. 运算

~10

10 = 8 + 2 = 2^3 + 2^1
   = 0000 1010
补码为 0000 1010 补码

取反后为:
1111 0101 补码
1111 0100 反码
1000 1011 原码

得到:~10 = -11

~-22

-22 = -(16 + 4 + 2) = -(2^4 + 2^2 + 2^1)
    = 1001 0110
原码为 1001 0110
反码为 1110 1001
补码为 1110 1010

取反后为:
0001 0101 补码
0001 0101 反码
0001 0101 原码

得到:~-22 = 21

-20 & 35

-20 = -(16 + 4) = -(2^4 + 2^2)
    = 1001 0100
原码为 1001 0100
反码为 1110 1011
补码为 1110 1100

35 = 32 + 2 + 1 = 2^5 + 2^1 + 2^0
   = 0010 0011
原码=反码=补码=0010 0011

-20   ->   1110 1100
35    ->   0010 0011
进行&运算   0010 0000
原码=反码=补码=0010 0000

得到:-20 & 35 = 2^5 = 32

-20 ^ -30

-20 = -(16 + 4) = -(2^4 + 2^2)
    = 1001 0100
原码为 1001 0100
反码为 1110 1011
补码为 1110 1100

-30 = 16 + 8 + 4 + 2 = 2^4 + 2^3 + 2^2 + 2^1
   = 1001 1110
补码为 1001 1110
反码为 1001 1101
原码为 1110 0010

-20   ->   1110 1100
-30   ->   1110 0010
进行^运算   0000 1110
原码=反码=补码=0000 1110

得到:-20 ^ -30 = 2^1 + 2^2 + 2^3 = 14

-20 | 28

-20 = -(16 + 4) = -(2^4 + 2^2)
    = 1001 0100
原码为 1001 0100
反码为 1110 1011
补码为 1110 1100

28 = 16 + 8 + 4 = 2^4 + 2^3 + 2^2 
   = 0001 1100
原码=反码=补码=0001 1100

-20   ->   1110 1100
28    ->   0001 1100
进行|运算   1111 1100
补码为 1111 1100
反码为 1111 1011
原码为 1000 0100

得到:-20 ^ 28 = 2^2 = -4

35 >> 2

35 = 32 + 2 + 1 = 2^5 + 2^1 + 2^0
   = 0010 0011
原码=反码=补码=0010 0011
    >>后的结果0000 1000 补码
             0000 1000 反码
             0000 1000 原码

结果为: 8

-20 >> 2

-20 = -(16 + 4) = -(2^4 + 2^2)
    = 1001 0100
原码为 1001 0100
反码为 1110 1011
补码为 1110 1100
>>后的结果1111 1011补码
         1111 1010 反码
         1000 0101 原码

结果为:-5

35 << 2

35 = 32 + 2 + 1 = 2^5 + 2^1 + 2^0
   = 0010 0011

原码=反码=补码=0010 0011
  <<后的结果为1000 1100 补码
             1000 1011 反码
             1111 0100 原码

结果为: 2^2 + 2^4 + 2^5 + 2^6 = -116

结果错误,解决方案如下:
原码=反码=补码=0000 0000 0000 0000 0010 0011
  <<后的结果为0000 0000 0000 0000 1000 1100 补码=反码=原码

结果为: 2^2 + 2^3 + 2^7 = 4 + 8 + 128 = 140

-20 << 2

-20 = -(16 + 4) = -(2^4 + 2^2)
    = 1001 0100
原码为 1001 0100
反码为 1110 1011
补码为 1110 1100
<<后的结果为1011 0000 补码
           1010 1111 反码
           1101 0000 原码

结果为2^4 + 2^6 = 16 + 64 = -80

4. switch

switch()括号里面传递的数据只能是byte short int char String 枚举类

posted @ 2022-06-16 12:13  jsqup  阅读(200)  评论(0编辑  收藏  举报