按位取反
二进制数在内存中是以补码的形式存放的,我们按位取反就是把补码的0变成1,1变成0。而我们看到的数字是二进制的原码转换成十进制的结果。
先举个例子,比如我们看-8这个数,它的二进制是1111 1000,负数的符号位全为1,即如下表:
数字 | -8 | 正数 |
---|---|---|
原码 | 1111 1000 | 二进制原码 |
反码 | 1111 0111 | 负数原码到反码符号位不变,其他位0变1,1变0 |
补码 | 1111 1000 | 负数反码到补码需要+1 |
取反之后的补码 | 0000 0111 | 所有0变1,1变0,取反变成正数 |
反码 | 0000 0111 | 正数的原码,反码,补码一样 |
原码 | 0000 0111 | 正数的原码,反码,补码一样 |
数字 | 7 | ~-8结果为7 |
再举个例子,比如我们看8这个数,它的二进制是0000 1000,正数的符号位全为0,即如下表:
数字 | 8 | 正数 |
---|---|---|
原码 | 0000 1000 | 正数的原码,反码,补码一样 |
反码 | 0000 1000 | 正数的原码,反码,补码一样 |
补码 | 0000 1000 | 正数的原码,反码,补码一样 |
取反之后的补码 | 1111 0111 | 所有0变1,1变0,取反变成负数 |
反码 | 1111 0110 | 负数反码到补码需要+1,反之补码到反码-1 |
原码 | 1111 1001 | 负数原码到反码符号位不变,其他位0变1,1变0,反之一样 |
数字 | -9 | ~8结果为-9 |
如果这篇文章帮助到了你,欢迎收藏,点赞。