整数取反和按位取反
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)