JavaRush /Java Blog /Random-KO /비트 부정 - 왜 그럴까요?
Alex Bolgov
레벨 37
Ташкент

비트 부정 - 왜 그럴까요?

Random-KO 그룹에 게시되었습니다
안녕하세요 여러분 :) Bitwise 연산 기사를 읽는 동안 저는 다른 사람들과 마찬가지로 질문이 있었습니다. 왜 숫자 342를 반전하면 -343이 나오는 걸까요? 기사에 나온 내용은 ​​다음과 같습니다. 비트 부정 - 왜 그렇습니까 - 1(나와 같이) 특히 호기심이 많은 사람들은 다음과 같은 질문을 합니다. "야, 하지만 010101001은 101010110보다 작습니다. 342보다 작고 양수여야 한다는 것이 논리적입니다." 온라인 숫자 변환기에 입력하거나 코드를 사용하여 확인하세요.
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
예기치 않게 -343 이외의 다른 결과가 나타납니다...
169
아, 옛날 옛적에 C 프로그래밍 수업에서 정수의 부호 숫자에 대해 간략하게 들었던 것이 얼마나 좋은지. 잠시 구글링을 해보니 이제 이것이 어떤 동물인지 설명할 수 있게 되었습니다. 비트 부정 - 왜 그렇습니까 - 2사실 기사에 부정확한 부분이 있어 혼란스럽습니다. 코드를 통해 숫자 342를 반전한 결과가 실제로 무엇인지 확인하면 다음과 같습니다.
int a = 342;
System.out.println(Integer.toBinaryString(~a));
그러면 약간 다른 결과가 나타납니다
11111111111111111111111010101001
왜 그럴까요? 문제는 변수가 단순히 101010110을 포함할 수 없다는 것입니다. 실제로는 다음과 같이 저장됩니다.
000000000000000000000000101010110
결국 int 변수는 4바이트를 사용합니다. 32비트 - 32개의 메모리 셀. 반전 후에는 절대적으로 모든 숫자가 변경됩니다. 선행 0을 "잘랐습니다". 이제 재미있는 부분이 나옵니다. 이진 표현에서는 숫자 앞의 + 또는 - 기호를 저장할 수 없으므로 한 가지 트릭이 있습니다. 바로 첫 번째 비트가 실제로 기호를 담당하며 정확히 부호 비트 입니다 . 그리고 모든 숫자는 다음 논리에 따라 저장됩니다. 00...000부터 01...111까지의 숫자는 0부터 시작하고(예: 0부터 2147483647까지) 10...000부터 11...111까지 양수입니다. 가장 작은 것부터 시작하여 -1로 끝나는 음수입니다(예: -2147483648에서 -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
그런 다음 "좋아요, Navalny, 우리는 당신을 믿을 것입니다. 그런데 왜 이것이 그의 궁전이라고 결정했습니까?"라고 묻습니다. 그러나 이 모든 것이 어떻게 -343으로 밝혀졌습니까? 정말 간단합니다. 우리는 이것을 수동으로 간단히 계산할 수 있습니다. 결과 숫자 342( 11111111111111111111111111111111010101001 )의 이진 버전에서 첫 번째 비트를 "잘라내거나"(또는 0으로 바꾸면) 십진수 형식으로 다시 반환합니다.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
그러면 우리는 그것을 얻습니다
01111111111111111111111010101001 = 2147483305
사실 여기서는 처음에 1을 "잘라낸" 것이 아니라 이 숫자에서 1000000000000000000000000000000000을 뺍니다. 이제 다시 십진수 형식으로 더해 보겠습니다. 우리가 보게 될 내용:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
여기에 필수 숫자 -343이 있습니다 :) 여러분, 이게 제 첫 번째 게시물입니다. 마음에 들었고 유익했다면 좋아요를 눌러주세요. (저는 정말 모든 성과를 수집하고 싶습니다 😄) 여기에서 이 주제에 대해 더 자세히 읽을 수 있습니다. 모두에게 행운을 빕니다. 관심을 가져주셔서 감사합니다)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION