笔记:取反运算

一、取反运算(~)

取反运算符是一单目位运算符,也就是只有一个操作数,表示为~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(先减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)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部