programing

~x + ~y == ~(x + y)는 항상 거짓입니까?

firstcheck 2022. 10. 2. 23:01
반응형

~x + ~y == ~(x + y)는 항상 거짓입니까?

이 코드는 항상 false로 평가됩니까?두 변수 모두 2의 보완 부호 ints입니다.

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

조건에 맞는 숫자가 있어야 할 것 같아요.나는 그 사이의 숫자를 시험해 보았다.-5000그리고.5000평등을 이루지 못했습니다.그 상태에 대한 해답을 찾기 위해 방정식을 설정하는 방법이 있나요?

한쪽을 다른 쪽과 교환하면 프로그램에 악의적인 버그가 발생합니까?

모순을 위해 어떤 것이 존재한다고 가정하자.x및 일부y(modn 2) 다음과 같이 한다.

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

2의 보완*으로, 우리는 그것을 알고 있다.

      -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

그러므로 모순이다.그러므로,~(x+y) != ~x + ~y모두를 위해x그리고.y(modn 2)


* 흥미로운 점은, 자신의 보완 산술이 있는 기계에서는 실제로 모든 사람에게 동등성이 적용된다는 것입니다.x그리고.y왜냐하면 한 사람의 보완 아래,~x = -x.따라서,~x + ~y == -x + -y == -(x+y) == ~(x+y).

2의 보완

대부분의 컴퓨터에서는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)항상 거짓입니다.


단, Pedants는 C가 2의 보수가 필요없다고 지적할 것이기 때문에, 우리는 또한 검토하지 않으면 안 된다.

보충 자료

보충의 의미로-x로 간단히 표현된다~x. 0은 특별한 경우로, 둘 다 0입니다.+0및 all-1(-0)의 표현, 단 IIRC, C에는+0 == -0비트 패턴이 다르더라도 문제 없습니다.대체품~와 함께-.

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

누구에게나 해당된다x그리고.y.

둘 다 오른쪽 끝 부분만 고려합니다.x그리고.y(IE.의 경우x == 13어느 것이1101Base 2에서는 마지막 부분인 a만 살펴보겠습니다.1다음으로 4가지 경우를 생각할 수 있습니다.

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:

이것도 당신에게 맡기겠습니다.

가능한 입력이 있을 경우 방정식의 왼쪽과 오른쪽에서 맨 오른쪽 비트가 항상 다르다는 것을 보여줄 수 있습니다.따라서 양쪽에는 적어도 서로 반전된 비트가 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 2n)

질문의 목적이 (C사양 읽기 스킬이 아니라) 수학을 테스트하는 것이라고 가정하면, 이것으로 답을 얻을 수 있습니다.

1과 2(그리고 42도)의 보형에서 이를 증명할 수 있습니다.

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

, 그럼 ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.a = y 다음과 같은것이 있습니다.

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

또는 다음과 같이 입력합니다.

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

로 그 2의 보충어로~0 = -1는 틀렸습니다

~0 = 0그 제안은 참이다.

Dennis Ritchie의 책에 따르면 C는 기본적으로 2의 보어를 구현하지 않는다.따라서 당신의 질문이 항상 맞는 것은 아닐 수 있습니다.

내버려 두는MAX_INT011111...111( 의 ( ( ( ( ( 。?~x + x = MAX_INT ★★★★★★★★★★★★★★★★★」~y + y = MAX_INT 때문에 이 두 가지 알 수 거예요.~x + ~y ★★★★★★★★★★★★★★★★★」~(x + y)1.

C는 2의 보완이 구현된 것이어야 한다고 요구하지 않는다.단, 부호 없는 정수의 경우 유사한 로직이 적용됩니다.이 논리에서 차이는 항상 1이 됩니다!

물론 C는 2의 보표현을 필요로 하지 않기 때문에 이 동작을 필요로 하지 않습니다.를 들어, 「」라고 하는 것은,~x = (2^n - 1) - x&~y = (2^n - 1) - y이 결과를 얻을 수 있습니다.

아, 기초 이산 수학!

모르간의 법칙을 확인하세요.

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

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

부울 증명에 매우 중요합니다!

언급URL : https://stackoverflow.com/questions/11111956/x-y-x-y-is-always-false

반응형