按位取反

按位取反 进制

  • 十进制
  • 十六进制

十进制

此部分摘抄于该博客
假设要对正数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
按位取反_第1张图片

十六进制

正数比如234 如图所示按位取反_第2张图片
负数
同正数的十进制做法,只不过最后以十六进制输出
按位取反_第3张图片
十进制的99即为十六进制的63

你可能感兴趣的:(写给自己看的)