有符号位的数据表示法以及位运算

有符号位的数据表示法

计算机底层对数据的运算是通过"补码"进行计算的!
一个数据拥有原码,反码,补码
正数:
原码,反码,补码都相同

如:
数字7
原码:00000111
反码:00000111
补码00000111
负数:
原码:先求出该数字的二进制,最高位为1,表示该数为负数
反码:原码的最高符号位不变,其他数值按位取反(0变1,1变0)
补码:反码末尾+1

如:
数字-7
原码:10000111
反码:11111000
补码:11111001

在类型转换问题上需要用到该知识点,例题:byte b = 130,b = ?
byte的存储范围为-128~127,而数字130超出了byte的存储范围,130默认还是为int类型.
将130用二进制表示:0b10000010,正数原码=反码=补码=10000010
int类型的130用二进制表示:00000000 00000000 00000000 10000010
byte b = (byte)130
int占四个字节,强制类型转换为byte,byte占一个字节,可以得到强类型转换之后的二进制为:10000010(补码),最高位为1,可知道这是一个负数,负数补码末尾-1得到反码:10000001,负数反码符号位不变,其他数值按位取反得到原码:11111110:然后将其换算为十进制表示:-64+32+16+8+4+2=-126

位运算

基本的位运算符有:
位与:&(有0则0)
位或:|(有1则1)
位异或:^(相同为0,不同为1)
反码:~(按位取反)

移动符号:
左移:<< :将最高符号位舍弃,末尾补0
右移:>>:如果最高位为0,在左边补0;如果最高位为1,左边补1
无符号右移:>>>:无论最高符号位是0还是1,都在左边补0

例题:3 & 4 = ? 3 | 4 = ? 3 ^ 4 = ? ~ 3 = ?
3与4默认为int类型数据
3:00000000 00000000 00000000 00000011
4:00000000 00000000 00000000 00000100

3 & 4 =
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------
00000000 00000000 00000000 00000000
结果:0
3 | 4 =
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------
00000000 00000000 00000000 00000111
结果:7
3 ^ 4 =
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------
00000000 00000000 00000000 00000111
结果:7
~ 3 =
00000000 00000000 00000000 00000011
--------------------------------------------------------
11111111 11111111 11111111 11111100(补码)
反码为补码末尾-1
11111111 11111111 11111111 11111011
原码为反码符号位不变,其他数值按位取反:
10000000 00000000 00000000 00000100
结果:-4
左移:<<
例:3<<2
3的二进制为:0b11
原码,反码,补码相同
00000000 00000000 00000000 00000011
(00)00000000 00000000 00000000 00001100(正数,原码 = 反码 = 补码)
结果:12
右移:>>
例:24>>2
24的二进制为:0b11000
原码,反码,补码相同
00000000 00000000 00000000 00011000
00000000 00000000 00000000 00000110(00)(正数,原码 = 反码 = 补码)
结果:6
例:-24>>2
-24的二进制原码为:
10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
移动后补码:
11111111 11111111 11111111 11111010(00)
反码:11111111 11111111 11111111 11111001
原码:10000000 00000000 00000000 00000110
结果:-6
无符号右移:>>>
例:-24>>>2
-24的二进制原码为:
10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
移动后补码:
00111111 11111111 11111111 11111010(00)
正数,原码 = 反码 = 补码
原码:00111111 11111111 11111111 11111010
结果为:1073741818

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值