C语言关于按位取反的详细解答

按位取反

 

~就是按位取反的意思

 

a=0,求~a

按位取反的意思就是0变1,1变0。

 

对于按位取反,我们做题之前需要记住以下几点

 

1、每个整数都由32个比特位组成

2、第一位是0的,表示该二进制表示的数为正整数,可以原码=反码=补码

3、第一位是1的,表示该二进制表示的数为负整数,比如

       原码:100000…001

       反码:111111…110

       补码:111111…111(在反码的基础上+1)

       补码变回反码就是补码 -1

4、任何情况下时,符号位(就是第一位)不变,但按位取反时除外。

      任何情况下按位取反时,所有的1和0都要变(包括符号位)

      取反码≠按位取反

现在开始做题

a=0时,求~a

 

a的原码为000…0000(第一位为0),则

    

      反码为000…0000

 

      补码为000…0000

 

按位取反,得

       111…1111(此时该码的地位仍处于补码)

变回反码

       111…1110       (-1后所得)

变回原码

       100…0001 (记住符号位是不变的)

求得~a= - 1 

 

 

再做正整数的

a=3,求~a

 

原码为000…0011

反码为000…0011

补码为000…0011

 

按位取反,得

111…1100

变成反码(-1)为(使用二进制高位补低位的方法)

111…1011

变原码为

100…0100

得~a= -4

 

负整数的情况

 

a=-2,求~a

原码为1000…0010

反码为1111…1101

补码为1111…1110

 

按位取反,得

 

0000…0001

变回反码

0000…0001  (0为第一位,原码=反码=补码)

变回原码

0000…0001

得~a=1

计算方法说清楚了,现在说一下原理:

数字的二进制展示出来给人看的是原码,参与进内存计算的是补码,

也就说加减乘除等等,都是以补码的形式计算出来后,再变回原码显示出来的。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值