笔记:取反运算
一、取反运算(~)
取反运算符是一单目位运算符,也就是只有一个操作数,表示为~x。
取反运算符,右结合性,作用是对参与运算的二进制位取反。~1为0,~0为1。
例如,~9可以转换为如下的运算:
~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110 (-10 在内存中的存储)
所以~9的结果为 -10。
这里可能就有疑问了:为啥是-10?别忘了他是补码需要转化成原码~
如何求其原码呢?
- 方法1(先减1,再取反)
符号位保持不变!
(A)先 - 1,得到 1111 0111
(B)取反(符号位保持不变,其他位置按位取反 ),得到 1000 1000
2. 方法2(先取反再加1)
符号位保持不变!
(A)将这个二进制数中(即 1111 1000),除了符号位,其余位置按位取反,得 1000 0111
(B)+ 1,得到 1000 1000
所有正整数的按位取反是其本身+1的负数
所有负整数的按位取反是其本身+1的绝对值
0的按位取反是 -1(0在数学界既不是正数也不是负数)
例如,~-9可以转换为如下的运算:
~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000 (8 在内存中的存储)
所以~-9的结果为 8。
公式法: ~x = -(x + 1)
原理:
公式法的内部是如何计算的呢:
以~11为例:
~11的计算步骤:
计算11的补码
转二进制:0 1011
计算补码:0 1011
按位取反:1 0100 (按位取反是在这进行的,即补码的形式进行按位取反) 注意:这里是 补码
将转为原码:
取其反码(因为补码是负数):1 1011
末位加一:1 1100
符号位为1是负数,即-12
以~(-11)为例:
~(-11)的计算步骤:
计算-11的补码
转二进制:1 1011
计算补码:1 0101
按位取反:0 1010 (按位取反是在这进行的,即补码的形式进行按位取反) 注意:这里是补码
将转为原码:
正数补码就是原码:0 1010
符号位为0是正数,即10
————————————————
版权声明:本文为CSDN博主「我真不会嘤语」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qk233/article/details/108715207
二、按位取反运算符的应用
(1)0的取反
(有符号整型int:~0 为 -1;无符号整型 unsigned int :~0 为 4294967295)
(2)相反数
(直接利用不嘛定义,对于正数x,他的 相反数的补码就是x二进制取反加1. ~x+1)
(3)代替减法
(由(2)延伸 :x - y = x + (-y) = x + ~y + 1)
(4)代替加法
(由(2)延伸 : x - ~y + 1)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
