안녕하세요 여러분 :) Bitwise 연산 기사를 읽는 동안 저는 다른 사람들과 마찬가지로 질문이 있었습니다. 왜 숫자 342를 반전하면 -343이 나오는 걸까요? 기사에 나온 내용은 다음과 같습니다. (나와 같이) 특히 호기심이 많은 사람들은 다음과 같은 질문을 합니다. "야, 하지만 010101001은 101010110보다 작습니다. 342보다 작고 양수여야 한다는 것이 논리적입니다." 온라인 숫자 변환기에 입력하거나 코드를 사용하여 확인하세요.
"좋아요, Navalny, 우리는 당신을 믿을 것입니다. 그런데 왜 이것이 그의 궁전이라고 결정했습니까?"라고 묻습니다. 그러나 이 모든 것이 어떻게 -343으로 밝혀졌습니까? 정말 간단합니다. 우리는 이것을 수동으로 간단히 계산할 수 있습니다. 결과 숫자 342( 11111111111111111111111111111111010101001 )의 이진 버전에서 첫 번째 비트를 "잘라내거나"(또는 0으로 바꾸면) 십진수 형식으로 다시 반환합니다.
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
예기치 않게 -343 이외의 다른 결과가 나타납니다...
169
아, 옛날 옛적에 C 프로그래밍 수업에서 정수의 부호 숫자에 대해 간략하게 들었던 것이 얼마나 좋은지. 잠시 구글링을 해보니 이제 이것이 어떤 동물인지 설명할 수 있게 되었습니다. 사실 기사에 부정확한 부분이 있어 혼란스럽습니다. 코드를 통해 숫자 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
그런 다음 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이 있습니다 :) 여러분, 이게 제 첫 번째 게시물입니다. 마음에 들었고 유익했다면 좋아요를 눌러주세요. (저는 정말 모든 성과를 수집하고 싶습니다 😄) 여기에서 이 주제에 대해 더 자세히 읽을 수 있습니다.
모두에게 행운을 빕니다. 관심을 가져주셔서 감사합니다)
GO TO FULL VERSION