首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解释为什么x == ~(~x + 1) +1(两个补语和后面!)

解释为什么x == ~(~x + 1) +1(两个补语和后面!)
EN

Stack Overflow用户
提问于 2015-11-06 12:38:08
回答 2查看 707关注 0票数 5

我们都知道,记忆中的负数通常表示为两个人的补码,就像这样

代码语言:javascript
运行
复制
from x to ~x + 1

为了回去,我们不做明显的事情

代码语言:javascript
运行
复制
~([~x + 1] - 1)

但相反,我们有

代码语言:javascript
运行
复制
~[~x + 1] + 1

有人能解释一下为什么总是起作用吗?我想我可以用1位,2位,3位数来证明它,然后使用数学归纳法,但它并不能帮助我理解它是如何工作的。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-06 12:56:20

反正也是一样的。就是,~x + 1 == ~(x - 1)。但让我们暂时搁置这件事。

f(x) = ~x + 1是它自己的反面。证明:

代码语言:javascript
运行
复制
~(~x + 1) + 1 =
(definition of subtraction: a - b = ~(~a + b))
x - 1 + 1 =
(you know this step)
x

还有,~x + 1 == ~(x - 1)。为什么?井,

代码语言:javascript
运行
复制
~(x - 1) =
(definition of subtraction: a - b = ~(~a + b))
~(~(~x + 1)) =
(remove double negation)
~x + 1

(有点不寻常的)减法的定义,a - b = ~(~a + b)

代码语言:javascript
运行
复制
~(~a + b) =
(use definition of two's complement, ~x = -x - 1)
-(~a + b) - 1 =
(move the 1)
-(~a + b + 1) =
(use definition of two's complement, ~x = -x - 1)
-(-a + b) =
(you know this step)
a - b
票数 5
EN

Stack Overflow用户

发布于 2015-11-06 12:43:56

这是因为如果您增加~x (假设没有溢出)。然后将它转换回x,您已经相对于x增加了,但相对于x却减少了。同样的事情也是如此。假设变量x有一个特定的值,每次增加它时,相对于~x,您会注意到它会减少。

从程序员的角度来看,这就是你所能看到的。

代码语言:javascript
运行
复制
Let short int x = 1         (0x0001)
then ~x = 65534             (0xFFFE)
~x + 1 =  65534 + 1         (0xFFFF)
~(~x+1) = 0                 (0x0000)
~(~x+1) + 1 = 0 + 1         (0x0001)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33566989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档