c语言基础难关:按位取反

1.理解按位取反的前提

符号位

二进制最前端的1代表负数,0代表正数,符号位一般会占据最前端
比如1字节数的0可以表示为

[0000 0000]

1个字节最大存储数为

[0111 1111][1111 1111]
分别是28次方-1,即 255-255
符号位占据了一个比特位

原码反码补码的相互转化

正数的相互转化
	原码:符号位为0,其后将十进制转化为二进制,得到的就是其原码
	反码:与原码相同
	补码:与原码相同
负数的相互转化
	  原码:符号位为1,其后将十进制转化为二进制,得到的就是其原码
	  反码:符号位不变,其余都进行取反,原先为1的变为0,原先为0的变为1
	  补码:反码+1

举例

正数  1 --- [0000 0001]--- [0000 0001]--- [0000 0001]补
负数 -1 --- [1000 0001]--- [1111 1110]--- [1111 1111]

2.按位取反的具体逻辑

得到新补码后要注意符号位是什么,如果为1则继续推演,如果为0,则得到的新补码就是新原码
步骤

(1)得到该数的补码
(2)对补码取反,得到新的补码
(3) 对新补码反向求原码

对于得到新补码逆向求出新原码的过程

 如果把负数原码到补码的过程当作通用的流程
 那么原码到反码,先要保留符号位,然后再对原码取反
 最后反码加1得到补码
 那么逆向过程 补码 -> 反码-> 原码 
 则为
 补码减一得到反码
 反码再保留符号位得到原码

举例

0的按位取反
1.得到补码
	 [0000 0000]原码
	 由于正数的原码反码补码相同,则
	 [0000 0000]为补码
2.对补码取反,得到新的补码
	[0000 0000]  原先的补码
	[1111 1111]新补码
	
3.逆向求原码
	补码减一得到反码
	[1111 1110]新反码
	 反码取反得到原码
	 则符号不变,其余取反
	 [1000 0001] 新原码
	 

根据计算器可看出来推演正确
在这里插入图片描述

-2的按位取反
1.得到原码
   [1000 0010] 原码
    得到反码时符号位不变,其余取反
   [1111 1101]  反码
    反码加1得补码
   [1111 1110] 补码
2.对补码取反,得到新的原码
   [1111 1110] 原先的补码
   取反
   [0000 0001] 新补码
   由于新补码符号位为0,则其新原码与其新补码相同
   [0000 0001] 新原码

根据计算器可知演算过程正确

在这里插入图片描述

一些简便按位取反的简便计算

取反的符号为’ ~ ’
1.一个数取反再取反便是他本身,例如 ~ ( ~ 100 ) = 100
2.负数的取反可由公式直接推得
公式 ~x=-(x+1)
例如~ (-100) = - (-100 + 1) = 99
也可以理解为负数的取反就是 负数的绝对值减1
即 ~ (100)= |-100| - 1 = 99

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涅槃豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值