原码补码反码运算

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 @   jsqup  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示