簡體   English   中英

~x + ~y ==〜(x + y)總是假的?

[英]~x + ~y == ~(x + y) is always false?

此代碼是否總是評估為false? 這兩個變量都是兩個補碼簽名的整數。

~x + ~y == ~(x + y)

我覺得應該有一些數字滿足條件。 我嘗試測試-50005000之間的數字,但從未達到平等。 有沒有辦法建立一個方程來找到條件的解?

將一個換成另一個導致我的程序中的一個陰險的錯誤?

為了矛盾,假設存在一些x和一些y (mod 2 n

~(x+y) == ~x + ~y

通過兩個補碼*,我們知道,

      -x == ~x + 1
<==>  -1 == ~x + x

注意到這個結果,我們有,

      ~(x+y) == ~x + ~y
<==>  ~(x+y) + (x+y) == ~x + ~y + (x+y)
<==>  ~(x+y) + (x+y) == (~x + x) + (~y + y)
<==>  ~(x+y) + (x+y) == -1 + -1
<==>  ~(x+y) + (x+y) == -2
<==>  -1 == -2

因此,矛盾。 因此,對於所有xy (mod 2 n ), ~(x+y) != ~x + ~y


*值得注意的是,在具有一個補碼算術的機器上,相等實際上對於所有xy 這是因為在一個補碼下, ~x = -x 因此, ~x + ~y == -x + -y == -(x+y) == ~(x+y)

兩個人的補充

絕大多數計算機上,如果x是整數,則-x表示為~x + 1 等價地, ~x == -(x + 1) 在你的等式中進行這種替換給出了:

  • ~x + ~y ==〜(x + y)
  • - (x + 1)+ - (y + 1)= - ((x + y)+ 1)
  • -x - y - 2 = -x - y - 1
  • -2 = -1

這是一個矛盾,所以~x + ~y == ~(x + y)總是假的


也就是說,小學生會指出C不需要兩個補碼,所以我們也必須考慮......

一個人的補充

一個補碼中-x簡單地表示為~x 零是一種特殊情況,具有全0( +0 )和全-1( -0 )表示,但IIRC,C需要+0 == -0即使它們具有不同的位模式,所以這不應該是一個問題。 只需用-代替~

  • ~x + ~y ==〜(x + y)
  • -x +(-y)= - (x + y)

對於所有xy都是如此

只考慮xy的最右邊一點(IE。如果x == 13 ,基數2是1101 ,我們只看最后一位, 1 )然后有四種可能的情況:

x = 0,y = 0:

LHS:~0 + ~0 => 1 + 1 => 10
RHS:〜(0 + 0)=> ~0 => 1

x = 0,y = 1:

LHS:~0 + ~1 => 1 + 0 => 1
RHS:〜(0 + 1)=> ~1 => 0

x = 1,y = 0:

我會把這個留給你,因為這是作業(提示:它與之前的x和y交換相同)。

x = 1,y = 1:

我也會把這個留給你。

給出任何可能的輸入,你可以證明在等式的左手側和右手側最右邊的位總是不同的,所以你已經證明雙方都不相等,因為它們至少有一個被翻轉的位彼此。

如果位數是n

~x = (2^n - 1) - x
~y = (2^n - 1) - y


~x + ~y = (2^n - 1) +(2^n - 1) - x - y =>  (2^n + (2^n - 1) - x - y ) - 1 => modulo: (2^n - 1) - x - y - 1.

現在,

 ~(x + y) = (2^n - 1) - (x + y) = (2^n - 1) - x - y.

因此,它們總是不相等,相差1。

暗示:

x + ~x = -1 (mod 2 n

假設問題的目標是測試你的數學(而不是你的閱讀C規范技能),這應該可以幫助你找到答案。

在一個和兩個(甚至是42個)的補充中,這可以證明:

~x + ~y == ~(x + a) + ~(y - a)

現在讓a = y ,我們有:

~x + ~y == ~(x + y) + ~(y - y)

要么:

~x + ~y == ~(x + y) + ~0

因此在〜0 ~0 = -1的二進制補碼中,命題是錯誤的。

在一個補碼中, ~0 = 0 ,這個命題是正確的。

根據Dennis Ritchie的書,C默認不實現二進制補碼。 因此,您的問題可能並非總是如此。

MAX_INT011111...111表示的int(無論多少位)。 那么你知道, ~x + x = MAX_INT~y + y = MAX_INT ,因此你肯定知道~x + ~y~(x + y)之間的差值是1

C不要求兩個補碼是實現的。 但是,對於無符號整數,應用類似的邏輯。 在這個邏輯下,差異總是1!

當然,C不需要這種行為,因為它不需要二進制補碼表示。 例如, ~x = (2^n - 1) - x~y = (2^n - 1) - y將得到此結果。

啊,基礎離散數學!

查看De Morgan定律

~x & ~y == ~(x | y)

~x | ~y == ~(x & y)

布爾證明非常重要!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM