取反运算符
在 C 语言中,取反运算符 “~” 是按位取反运算符。
一、计算原理
它对一个整数的每一位进行取反操作,即将 0 变为 1,将 1 变为 0。
例如,对于一个 8 位的整数:
假设初始值为
5,其二进制表示为
00000101。
对其进行取反操作后变为
11111010。
如果这个数是有符号数,按照补码规则解释,这个值为
-6。
补充:取反运算符得到的结果转为符号数,可以理解为,取反后的二进制转十进制的数 - 2^{m-1} - 2^{m-2} - ... - 2^{m-m}次方 -1,m为二进制位数,m不足4的倍数则向上补齐。
例如63的二进制为111111,将其位数补齐为4的倍数则为00111111,则~63 = 11000000 ,11000000转换为十进制为192,这里m=8,63去取反后的符号数为,192-128-64-32-16-8-4-2-1-1=-64
也可以理解为是63的负数减一(这样比较好理解)
二、应用场景和注意事项
- 位操作:常用于位操作场景,比如设置或清除某些特定的位。例如,要清除一个整数的最低位,可以使用 x = x & (~1),这里 ~1 的结果是一个除了最低位为 0 其余位为 1 的数,与 x 进行按位与操作就可以清除 x 的最低位。
- 优先级:取反运算符的优先级较高,在复杂表达式中要注意使用括号来明确运算顺序,以避免出现意外的结果。
- 数据类型:对不同数据类型进行取反操作时,要考虑数据类型的位数和表示范围。例如,对一个短整型(short)和一个长整型(long)进行取反操作,结果的位数和取值范围是不同的。
- 有符号数和无符号数:对于有符号数和无符号数的取反结果可能会有很大差异,因为有符号数使用补码表示,而无符号数直接按位取反解释。例如,对 -1(有符号数,二进制补码表示为全 1)进行取反和对无符号数 4294967295(十六进制为 0xFFFFFFFF,二进制也是全 1)进行取反,结果虽然在二进制表示上相同,但解释却不同,前者取反后变为 0,后者取反后变为 0(无符号数解释)。