[operators] 비트 보수 연산자 (~ 틸드)는 어떻게 작동합니까?

~ 2가 -3과 같은 이유는 무엇입니까? ~운영자 는 어떻게 작동합니까?



답변

음수 는 양수에 대한 2의 보수 로 저장됩니다 . 예를 들어 다음은 2의 보수에서 -2를 나타냅니다. (8 비트)

1111 1110

이것을 얻는 방법은 숫자의 이진 표현을 취하고 보수를 취하고 (모든 비트를 뒤집 음) 1을 더하는 것입니다. 두 개는 0000 0010으로 시작하고 비트를 뒤집 으면 1111 1101이됩니다. 하나를 추가하면 위의 결과를 얻습니다. 첫 번째 비트는 부호 비트이며 음수를 의미합니다.

따라서 ~ 2 = -3을 얻는 방법을 살펴 보겠습니다.

다시 두 가지가 있습니다.

0000 0010

모든 비트를 뒤집기 만하면 다음과 같이됩니다.

1111 1101

2의 보수에서 -3의 모양은 무엇입니까? 양수 3 : 0000 0011로 시작하여 모든 비트를 1111 1100으로 뒤집고 1을 추가하여 음수 값 (-3), 1111 1101이되도록합니다.

따라서 단순히 2의 비트를 뒤집 으면 2의 보수 표현 인 -3을 얻게됩니다.

보수 연산자 (~) JUST FLIPS BITS. 이 비트들을 해석하는 것은 기계에 달려 있습니다.


답변

~ 값의 비트를 뒤집습니다.

숫자가 비트 단위로 표시되는 방식과 관련이있는 이유 ~2는 무엇입니까? -3숫자는 2의 보수 로 표시됩니다 .

2는 이진수 값입니다

00000010

그리고 ~ 2는 비트를 뒤집어서 값이 다음과 같습니다.

11111101

-3의 이진 표현입니다.


답변

다른 사람들이 언급 한 ~것처럼 비트를 뒤집어 놓고 (1에서 0으로, 0에서 1로 변경) 2의 보수 가 사용되므로 결과를 얻습니다.

한 가지 더해야 할 점은 2의 보수가 사용되는 이유 입니다. 따라서 음수에 대한 연산이 양수에 대한 연산과 동일합니다. 0을 얻기 위해 추가해야 할 -3숫자로 생각 3하면이 숫자는 1101임을 알 수 있습니다. 이진수 추가는 10이 아닌 2에 도달 할 때 1을 소지 한 초등학교 (10 진수) 추가와 같습니다. .

 1101 +
 0011 // 3
    =
10000
    =
 0000 // lose carry bit because integers have a constant number of bits.

따라서 1101됩니다 -3, 당신이 얻을 비트 플립 0010이있다.


답변

이 작업은 부정이 아닌 보완입니다.

~ 0 = -1이라고 생각하고 거기서부터 작업하십시오.

부정 알고리즘은 “보완, 증분”입니다.

알고 계십니까? 역수 대칭 인 “1의 보수”도 있으며 0과 -0을 모두 갖습니다.


답변

이 질문에 대한 답변이 오래 전 게시 된 것을 알고 있지만 같은 답변을 공유하고 싶었습니다.

숫자의 보수를 찾으려면 먼저 이진수에 해당하는 것을 찾으십시오. 여기서 10 진수 는 이진 형식으로 2표시됩니다 0000 0010. 이제 이진 표현의 모든 숫자를 뒤집어 (모든 1을 0으로, 0을 모두 1로 뒤집 음) 1을 보완하면 다음과 같은 결과가 나타납니다.

0000 0010 → 1111 1101

이것은 10 진수 2의 보수입니다. 그리고 첫 번째 비트, 즉 부호 비트는 이진수에서 1이므로 부호는 저장된 숫자에 대해 음수 임을 의미합니다 . (여기서 언급 된 숫자는 2 가 아니라 2의 보수입니다).

이제 숫자는 2의 보수로 저장되므로 (1의 보수에 1을 더한 1을 차지함)이 이진수 1111 1101를 10 진수 로 표시 하려면 먼저 2의 보수를 찾아야합니다.

1111 1101 → 0000 0010 + 1 → 0000 0011

이것은 2의 보수입니다. 이진수의 10 진수 표현은 0000 0011입니다 3. 그리고 부호 비트는 위에서 언급 한 것과 같으므로 결과 답은 -3입니다.

힌트 : 이 절차를주의 깊게 읽으면, 보수 연산자의 결과는 실제로 숫자 (오퍼레이터-이 연산자가 적용되는 숫자)에 음수 부호를 더한 것임을 알 수 있습니다. 다른 번호로도 시도 할 수 있습니다.


답변

int a = 4; System.out.println (~ a); 결과는 다음과 같습니다 .-5

Java에서 정수의 ‘~’는 1의 1의 보수를 나타냅니다. 예를 들어 나는 ~ 4를 취하고 있는데, 이것은 이진 표현 0100을 의미합니다. 첫째, 정수의 길이는 4 바이트, 즉 4 * 8 (1 바이트의 경우 8 비트) = 32입니다. 따라서 시스템 메모리 4에서 0000 0000 0000 0000 0000 0000 0000 0100으로 표시됩니다. ~ 연산자는 위의 바이너리에 대해 1의 보수를 수행합니다.

즉 1111 1111 1111 1111 1111 1111 1111 1011-> 1의 보수는 최상위 비트가 1이면 no (-또는 +)의 부호를 나타내고 0이면 부호는 ‘-‘이고 0이면 부호는 ‘+’입니다 이 결과는 음수이며, 자바에서는 음수가 2의 보수 형식으로 저장됩니다. 획득 한 결과는 2의 보수로 변환해야합니다 (먼저 1의 보수를 수행하고 1을 1의 보수를 추가하십시오). 가장 중요한 비트 1을 제외한 모든 비트가 0이됩니다 (숫자의 부호 표시, 나머지 31 비트는 1111 1111 1111 1111 1111 1111 1111 1011 (~ 연산자의 획득 결과) 1000 0000 0000 0000 0000 0000 0000 0100 (1의 보수)

1 (2의 보수)

1000 0000 0000 0000 0000 0000 0000 0101 이제 결과는 -5입니다. 비디오에 대한이 링크를 확인 하십시오.


답변

간단히 ………..

어떤 수의 2의 보수로, 우리는 1을 더하는 것보다 모든 1을 0으로 그리고 그 반대로 반전함으로써 계산할 수 있습니다.

여기서 N = ~ N은 항상 결과를 생성합니다. 시스템은 2의 보수 형태로 데이터를 저장하기 때문에 ~ N을 이와 같이 저장합니다.

  ~N = -(~(~N)+1) =-(N+1).

예를 들면 :

  N = 10  = 1010
  Than ~N  = 0101
  so ~(~N) = 1010
  so ~(~N) +1 = 1011

이제 포인트는 마이너스가 오는 곳입니다. 내 의견으로는 32 비트 레지스터가 있는데 이는 작동에 관련된 2 ^ 31 -1 비트를 의미하고 일반적으로 1 인 부호 비트로 저장된 초기 계산 (보완)에서 변경된 1 비트를 쉬게한다고 가정합니다. 그리고 우리는 ~ 10 = -11로 결과를 얻습니다.

~ (-11) = 10;

printf ( “% d”, ~ 0); 우리는 결과를 얻는다 : -1;

그러나 32 비트 시스템에서 printf ( “% u”, ~ 0) 결과 : 4294967295보다.