原码、反码、补码以及位运算学习

原码

原码是一种计算机中对数字的二进制定点表示方法。
原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。(百度百科)

仅用八位来表示,6的原码是:

00000110

-6的原码是:

10000110

优点

简单直观

缺点

不能直接参加运算

引出问题:为什么不能直接参加运算?

因原码需要用单独的一个bit来表示符号位,运算时计算机需要识别原码是正数还是负数,然后再进行相应的运算,效率不高,如果想要符号位也参与运算,就需要用到反码。

反码

正数的反码是其本身,负数的反码是原码的符号位不变,其他位按位取反。

反码也不能直接参与运算,因为有些数值的运算结果会不对!

比如:

5-3
= 5+(-3)
= 0000 0101(反码) + 1111 1100(反码) 
= 0000 0001(反码)
= 0000 0001(原码) 
= 1

5-3=1?结果相差了1.

补码

为了解决反码的问题就出现了补码。

正数的补码是其本身,负数的补码是反码加1(其绝对值的二进制位再按位取反加1)。

使用补码进行运算结果就正确了:

5-3
= 5+(-3)
= 0000 0101(补码) + 1111 1101(补码)
= 0000 0010(补码)
= 0000 0010(原码) 
= 2

总结

正数的原码、反码、补码都是其本身;负数的原码是最高位为符号位用1表示,其他位表示数值,反码是其绝对值的二进制位再按位取反;补码是反码加1.

在计算机系统中,数值一律用补码来表示(存储),所以运算的时候也是用补码来进行运算。

位运算

常见位操作符

~(按位取反)^(异或)|(按位或)、&(按位与)
&&(逻辑与)||(逻辑或)!()
<<(左移)、>>(右移)、>>>(无符号右移,高位填充0

|&(按位与) | |(按位或)|^(异或) |
|–|–| --|
| 像二进制乘法,两个位都为1时,结果才为1 | 二者有1结果即为1,两个位都为0时,结果才为0 |两个位相同为0,不同为1 |

|~(取反) | <<(左移) |
|–|–| --|
| 0变1,1变0 |符号位不变,各二进位全部左移若干位,高位丢弃,低位补0 |

|>>(右移) | >>>(无符号右移) |
|–|–| --|
| 符号位不变,右移若干位,正数左补0,负数左补1,右边丢弃 |右移后左边空出的位用零来填充。移出右边的位被丢弃。(符号位也参与移动) |

参考:
1.位运算(&、|、^、~、>>、<<)
2.源码劝退师:看源码一定要会的位运算、补码、反码、原码

1.一道笔试题:

以下 b 的值是: byte b = (byte)129。()

A 、-126 B、-127 C、 -128 D、-129

答案是:B。

解析:

这题考察的就两个知识点:
一、强制转换(主要涉及各个类型占几个字节,这里我只简单说一下byte型占一个字节,也就是8位,int型4个字节,32位);
二、在计算机系统中,数值一律用补码来表示(存储)

129 int类型(4个字节)二进制: 00000000 00000000 00000000 10000001强制转换byte型后,只有一个字节即 10000001(注意这里从二进制角度看,第一位是符号位,即求负数的补码接下来)只要求出上面原码对应的补码就行了,然后再转换对应的int型数值(因为题干所给的答案都是比较int型)10000001(原码) 对应的反码为1111 1110又补码等于反码+1即1111 1111 该二进制转换int型刚好是-127(1+2+4+8+16+32+64)

来源:牛客网,解析来自牛客网评论。

链接

2.一个byte是1个字节,能表示的数的范围是-128~127.请问,这是为什么呢?

答:因为在计算机系统中,数值一律用补码来表示,8位二进制数的数值范围也是用补码来表示的,大小是:10000000~01111111(-128-127),为什么10000000就是表示-128,负数比正数多1呢?

回答:

因为有一位是符号位,所以后7位是数值位。
2^7=128,所以正数和负数各有127个(正数0 000 0000 ~ 0 111 1111、负数 1 000 0000),但是机器中是有0的,而且“0”有“+0”和“-0”之分。
所以:
正数是从 +0 ~ +127,刚好128个数字;
负数是从 -127 ~ -0,也刚好128个数字。

但是在补码中 +0 = -0 ,所以,-0这个位置空了出来,因此就在负数的区域中多出一位,把这一位进行平移,由原来的 -127 ~ -0,变成 -128 ~ -1,也还是128位。
所以补码多出的一个负数值为最小负数,并可以理解成把补码的最小负数定义为 -128。

来源:
为什么用二进制补码所能表示的数据范围比原码多一个数据单位

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值