按位取反

按位取反 进制

十进制

此部分摘抄于该博客
假设要对正数9按位取反——> (~9),计算步骤如下,

原码为 0000 1001,

反码为 0000 1001,

补码为 0000 1001,
(正数的原码=反码=补码)
对其取反 1111 0110(符号位一起进行取反,这不是反码更加不是最终结果,只是补码的取反仅此而已)

我们还需要把他转换成原码,因为是负数所以进行负数补码到原码的逆运算

先减1得反码: 1111 0101

取反得原码:1111 1010,(反码和原码是一个相对的概念,对反码取反就是原码。取反过程符号位是不变的哦)

前面4个1是符号位,1是负数,既得十进制:-10

这里步骤就是:

1. 先对正数求补码(就是原码本身)

2. 然后对补码取反,包括符号位

3. 最后进行一个补码求原码的过程,一定要搞清概念啊。


下面我们再反推计算 (~ -10)

-10的原码:1111 1010

-10的反码:1111 0101 (符号位不变)

-10的补码:1111 0110 (符号位不变,末位+1)

补码取反:0000 1001 (符号位一起取反)

这是一个正数,那么我们对其求原码就可得到最终结果?

因为正数的补码,反码,原码都是一样的 那我们的最终结果是 0000 1001 ,十进制是 9,这与我们前面推算出的结果吻合。


printf("%d\n",~7)//十进制输出 :-8

之所以出现-8在于结果溢出,比如

printf("%u\n",~7)//十进制输出 :4294967288

因此,输出结果为-8在于超过了int的范围


最后一个有趣的事实是:

1. 所有正整数的按位取反是其本身+1的负数

2. 所有负整数的按位取反是其本身其绝对值-1

3. 零的按位取反是 -1(0在数学界既不是正数也不是负数)
eg:234
在这里插入图片描述

十六进制

正数比如234 如图所示在这里插入图片描述
负数
同正数的十进制做法,只不过最后以十六进制输出
在这里插入图片描述
十进制的99即为十六进制的63

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值