JavaRush /Java Blog /Random-KO /자바: 비트와 바이트
Viacheslav
레벨 3

자바: 비트와 바이트

Random-KO 그룹에 게시되었습니다
Java: 비트 및 바이트 - 1

소개

사람이 십진수 체계로 계산된다면 컴퓨터는 이진수 체계로 계산됩니다. 그리고 프로그래머는 사람과 컴퓨터 모두와 대화하는 방법을 이해해야 합니다. 이 검토는 이 문제에 도움이 될 것입니다. 때로는 뻔한 것 뒤에 숨겨진 온 세상이 있습니다. 나는 이 세상에 대해 이야기할 것을 제안합니다. 예를 들어 일주일은 7일입니다. 이제 질문에 답해 보겠습니다. 숫자 "7"은 무엇입니까? ) 첫째, 정수(양의) 자연수이다. 십진수이기도 합니다. 십진수는 십진법의 숫자입니다. "십진수 체계"라고 하면 숫자 체계의 밑수는 10 이라는 의미입니다 . 기수는 주어진 숫자 체계에서 숫자를 표시하기 위해 몇 개의 자릿수를 사용할 수 있는지를 나타냅니다. 카운트다운은 0부터입니다. 따라서 십진수 체계로 숫자를 표현하려면 0부터 9까지의 숫자를 사용합니다. 이것은 좋지만 9뿐만 아니라 그 이상까지 세어야 합니다. 어떻게 될까요? 예를 들어 숫자 10입니다. 이 숫자를 쓰려면 최대 2자리 숫자를 사용합니다. 십진법에서 각 숫자의 위치를 ​​소수점 자리라고 합니다. 숫자는 오른쪽에서 왼쪽으로 계산됩니다.
Java: 비트 및 바이트 - 2
또한, 십진수는 다음과 같이 전개될 수 있습니다: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: 비트 및 바이트 - 3
숫자는 기본적으로 오른쪽에서 왼쪽으로 증가합니다. 즉, 처음에는 7이었다가 10이 되었습니다. 따라서 숫자는 0부터 시작하여 오른쪽부터 계산됩니다. 이게 다 뭐죠? 그 이유는 우리가 컴퓨터가 아니기 때문입니다. 그리고 우리가 10진수(즉, 10진수)로 계산하는 반면, 컴퓨터는 2진수(즉, 2진수)로 계산합니다. 그러나 이러한 숫자 체계에 적용되는 규칙은 동일합니다.
Java: 비트 및 바이트 - 4

바이너리 시스템

이진법은 십진법과 매우 유사하지만 유일한 차이점은 여기서 한계가 10이 아니라 2라는 것입니다. 예를 들어 비교해 보겠습니다. 11을 이진수로 어떻게 표현하나요? 매우 간단합니다. 십진수를 2진수로 나누면 됩니다. 즉, 열에서 11/2을 계산하면 됩니다. 예:
Java: 비트 및 바이트 - 5
또는 WikiHow의 예는 다음과 같습니다.
Java: 비트 및 바이트 - 6
흥미롭게도 숫자를 십진수와 같은 방식으로 이진수로 표현할 수 있습니다. 이진수 111 = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: 비트 및 바이트 - 7
이진수를 십진수로 변환하는 예는 온라인 계산기 에서 볼 수 있습니다 . 숫자 체계의 연산 규칙이 동일하다는 사실에 관해 이야기하면서 이진 체계의 덧셈을 살펴보겠습니다.
Java: 비트 및 바이트 - 8
보시다시피 십진법에서와 같은 방식으로 덧셈 중에 숫자를 전송합니다. 추가 분석은 예를 들어 다음과 같이 볼 수 있습니다. 그런데 "방전"이라는 단어가 주기적으로 언급됩니다. 그리고 이것은 무엇입니까? 장소는 숫자를 표현하는 '구조적 요소'일 뿐이다. 즉, 숫자 10은 두 자리 숫자로 구성됩니다. 이 숫자를 쓰려면 숫자 2개, 자리 2개, 요소 2개가 필요합니다. 이진수 체계에서 숫자는 비트이기 때문에 이것을 이해하는 것이 중요합니다 . Bit라는 단어는 영어 "binary digit" , 즉 이진수에서 유래되었습니다. 0 또는 1일 수 있습니다. 그러나 우리가 숫자와 단어를 문자별로 읽지 않고 전체적으로 읽는 것처럼 컴퓨터는 한 번에 한 비트도 읽지 않습니다. RAM에서 처리된 정보의 최소 "조각" (소위 주소 지정이 가능한 가장 작은 정보 단위) 의 경우 8비트 시퀀스가 ​​읽혀집니다 . 8개가 있으므로 이것을 "옥텟"이라고 합니다. 또한 더 잘 알려진 단어는 Byte 입니다 . 옥텟을 기억하려면 문어(8개의 다리)라는 단어가 영어로 문어로 번역된다는 것을 기억할 수 있습니다. 즉, 제목에 정확히 동일한 "octo"가 있습니다.
Java: 비트 및 바이트 - 9
8비트로 표현할 수 있는 최대 수는 얼마인지 생각해 볼까요?
Java: 비트 및 바이트 - 10
그리고 여기서 질문이 생깁니다. 음수는 어떻습니까? 이를 이해하기 위해 Java에서 바이트가 어떻게 표현되는지 이야기해 보겠습니다.
Java: 비트 및 바이트 - 11

자바와 바이트

Java에서 음수를 어떻게 사용할 수 있나요? 간단하게 완료되었습니다. Java에서는 바이트가 서명됩니다. 가장 왼쪽 숫자/비트("최상위 비트"라고도 함)는 "이 숫자가 음수입니까?"라는 질문에 대답하는 일종의 "마커"로 만들어집니다. 대답이 '예'이면 마커의 값은 1입니다. 그렇지 않으면 0입니다. 숫자 5를 음수 5로 바꾸는 방법의 예를 살펴보겠습니다.
Java: 비트 및 바이트 - 12
이 그림을 바탕으로 바이트 값의 한계를 이해할 수 있습니다.
Java: 비트 및 바이트 - 13
또한 다음 사항도 분명합니다.
  • 127에 1을 더하면 -128이 됩니다.
  • -128에서 1을 빼면 127이 됩니다.
따라서 Java의 바이트는 -128에서 127까지의 값을 가질 수 있습니다. 우리가 기억하는 것처럼 바이트는 옥텟입니다. 그리고 최대 숫자/최상위 비트는 0부터 세기 때문에 일련 번호가 7입니다. 이 경우 1바이트는 -2의 7제곱(하한) ~ 2의 7 빼기 1(상한)과 같다는 것을 기억하기 쉽습니다. 데이터 유형 자체를 다루는 것은 간단합니다. 이 기사에서는 온라인 Java 컴파일러 "repl.it"를 "샌드박스"로 사용합니다. https://repl.it/언어/java. 예를 들어, 바이너리 형식의 바이트 변수를 문자열로 나타내는 코드를 실행해 보겠습니다.
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
바이트 작업은 I/O 스트림 작업 시 적극적으로 사용됩니다. Oracle의 튜토리얼 " I/O Streams "에서 자세한 내용을 읽을 수 있습니다. 또한 Java에서는 특수 리터럴을 사용하여 값을 비트로 지정할 수 있습니다.
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: 비트 및 바이트 - 14

비트 조작

바이트와 ​​비트를 다루다 보면 다양한 비트 조작을 언급하지 않을 수 없습니다. 아마도 가장 일반적인 연산은 시프트(비트 단위 시프트 또는 비트 시프트)일 것입니다. 그리고 그 결과에는 분명한 실질적인 이점이 있기 때문입니다. 무슨 소용이 있나요? N 위치만큼 왼쪽으로 이동하는 것은 숫자에 2N을 곱하는 것과 같습니다. 그리고 오른쪽으로 이동하는 것은 같은 나눗셈과 유사합니다.따라서 5<<2 == 5*Math.pow(2,2) 그리고 이것이 왜 그런지 이해하기 위해 다음 예를 더 자세히 살펴보겠습니다.
Java: 비트 및 바이트 - 15
물결표로 표시되는 비트 부정 NOT(단항 비트 단위)은 비트를 반전시킵니다. 예를 들어 ~5와 같이 물결표로 표시됩니다.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
이는 Java가 숫자의 부호를 변경할 때 맨 끝의 비트 값을 반전시키는 것 외에도 +1을 수행한다는 것을 다시 한 번 보여줍니다. 이것이 없으면 보시다시피 숫자 5가 변경됩니다. 그리고 부호를 변경하기 전과 동일한 숫자를 유지하려면 +1을 수행해야 합니다. 비트별 AND를 사용하면 모든 비트의 값이 1인 경우에만 비트에 대해 값이 1인 두 개의 서로 다른 숫자를 남길 수 있습니다. 이에 대한 흥미로운 점은 다음과 같은 몇 가지 응용 프로그램 이점이 있다는 것입니다.
int x=4;
System.out.println((x&1) != 1);
이 코드는 숫자 x의 패리티를 확인합니다. 예를 살펴보겠습니다:
Java: 비트 및 바이트 - 16
Bitwise AND와 Bitwise OR을 함께 사용하면 마스크를 사용할 수 있습니다.
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
자세한 내용은 " Java의 비트 연산자를 사용한 마스킹 옵션 "을 참조하십시오 . 비트 조작은 별도의 리뷰, 기사 및 서적이 작성된 흥미로운 주제입니다. 그리고 여기서부터 암호화를 향한 긴 여정이 시작됩니다. 이 검토의 일부로 이것이 작동하는 이유와 방법을 이해하는 것이 좋습니다. 비트 작업에 대한 자세한 내용은 tproger의 " 비트 작업 정보 " 리뷰를 읽어 보시기 바랍니다 .

기본 유형

따라서 1바이트는 옥텟, 즉 8비트입니다. 우연히도 Java에는 8개의 기본 유형도 있다는 것을 기억하기 쉽습니다. 기본 유형은 프로그래밍 언어에 내장되어 기본적으로 사용 가능한 데이터 유형입니다. 바이트는 Java가 사용할 수 있는 메모리 공간 측면에서 가장 작은 기본 데이터 유형입니다. 앞서 말했듯이 1바이트는 8비트를 차지합니다. 따라서 최상위 숫자는 7입니다. 따라서 바이트에는 결과의 -2에서 7승까지의 값과 2에서 7승에서 1을 뺀 값이 포함됩니다. 다른 기본 유형에는 어떤 것이 있습니까?
Java: 비트 및 바이트 - 17
표에서 볼 수 있듯이 차지하는 데이터 양에 따른 데이터 유형은 두 배로 늘어납니다. 즉, short = 2 * byte이고 int = 2 * short입니다. 실제로 기억하기 쉽습니다. 바이트 = 8비트임을 기억하세요. 그 이하일 수 없다는 사실도 기억된다. 영어에서는 정수를 정수라고 합니다. 그것의 기본 유형을 약어 int라고 불렀습니다. 일반 정수 - int가 있습니다. 짧은 버전인 Short와 긴 버전인 Long이 있습니다. 따라서 int는 32비트(4바이트)를 차지합니다. 짧은 버전은 2배 더 작습니다(16비트(2바이트)). 그리고 긴 버전은 2배 더 큽니다. 64비트(8바이트). 따라서 int는 최대 약 20억 1억 개의 숫자를 저장할 수 있습니다. 그리고 오랫동안 최대 약 9조(좋은 단어)를 저장할 수 있습니다. 초보 프로그래머가 1킬로바이트에 1000바이트가 있다고 생각하고 완전한 프로그래머가 1킬로그램에 1024그램이 있다고 믿는 방법에 대한 오래된 농담을 기억하면 다음을 이해할 수 있습니다.
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
그건 그렇고, 세심한 독자라면 그림에 7가지 유형만 있다는 것을 알아차렸을 것입니다. 8 기본 유형은 부울입니다. boolean은 true와 false라는 두 가지 값만 갖는 부울 데이터 유형입니다. 그러나 질문이 생깁니다. 크기는 얼마입니까? Java Virtual Machine 사양 및 " 2.3.4. The boolean Type " 섹션에서 다음과 같이 대답합니다.
Java: 비트 및 바이트 - 18
즉, 부울만 int와 동일한 양을 취합니다. 부울 배열을 선언하면 배열의 각 요소가 1바이트를 차지합니다. 정말 기적이에요 :)

결론

통합할 몇 가지 자료를 더 숙지하시기 바랍니다. #비아체슬라프
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION