整数取反和按位取反

1.概念

在计算机中,-res 和 ~res 是两种完全不同的操作,它们有不同的含义和效果
按位取反“~”:按位取反1变0,0变1

1.1 ‘-res’

-res表示对res进行整数取反操作。如果res是一个有符号整数的二进制表示,如 1010,那么-res将变为 -1010。

1.2 ‘~res’

~res 表示对res进行按位取反操作
~res会反转res中的每一位,将1变为0,0变为1。
例如,如果res是一个二进制数,如 1010,那么~res将变为 0101。

1.3 区别

所以-5值就是-5
而~按位取反,5二进制00000101,取反11111010,代表-6,所以~5值-6

1. 按位取反的规律

所有正整数的按位取反是其本身+1的负数
所有负整数的按位取反是其本身+1的绝对值
零的按位取反是 -1

2. 解释按位取反的规律

计算机为方便运算,是使用补码来存取数值的。
我们平时理解的是原码,比如像3=0 0011,-5 = 1 0101
但是实际上在计算机中的存储呢?

例:
(注:前面四位作为符号位)
正数9:(正数原码,补码,反码均一样)
原码为: 0000 1001
反码为: 0000 1001
补码为: 0000 1001
按位取反为:  1111 0110(这里是负数补码,反码 = (补码 -1), 原码 = 反码取反)
解码为:  1111 (0110 -1)(反码) = 1111 1010(原码) = -10 = -(9 + 1)

再例如: -2(负数的反码是在其原码的基础上, 符号位不变,其余各个位取反/负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1))
求原码: 1111 0010 (前面4个1表示符号位)
求反码: 1111 1101 (符号位不变,其余各位求反)
求补码: 1111 1110 (符号位不变,末位+1)
取反为:  0000 0001 
解码为:  0000 0001  = 1 = -2 + 1(正数原码,补码,反码均一样)

所有正整数的按位取反是  -(本身+1)
所有负整数的按位取反是abs(本身+1)

posted @ 2023-10-19 22:00  DawnTraveler  阅读(201)  评论(0编辑  收藏  举报