티스토리 뷰

Java/기본

021. 자바 : 비트연산자

따강아지 2022. 3. 6. 15:50

비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자로 1 또는 0을 사용합니다.
즉 변수에 값을 넣으면 메모리에 저장될 때는 0 또는 1의 2진수 값으로 저장을 하는데 이 값을 이용해서 연산을 합니다.

& 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
| 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산, 1의 보수)

bit 연산

비트 연산자를 사용하기 위해서는 먼저 진법 변환에 대해서 알아야 합니다. 자바에서는 진법 변환을 위해서 Integer Objecr에 진법 변환에 대한 API를 다음과 같이 제공합니다.

10진수 -> 다른 진법 변환 
10 진수 to 2진수 : Integer.toBinaryString(정수 리터럴),
10 진수 to 8진수 : Integer.toOctalString(정수 리터럴),
10 진수 to 16진수 :Integer.toHexString(정수 리터럴)

다른 진수 -> 10진수로 변환 
2 진수 to 10진수 : Integer.parseInt(2 진수 값, 2);
8 진수 to 10진수 : Integer.parseInt(8 진수 값, 8);
16 진수 to 10진수 : Integer.parseInt(16 진수 값, 16);

public class BitOperator {
   public static void main(String[] args) {
      int numA = 3;
      int numB = 2;

      int numC = numA & numB;

      System.out.println(String.format("%s & %s = %s", numA, numB,  numC)); // 1)

      System.out.println(String.format("%s & %s = %s",
            Integer.toBinaryString(numA),
            Integer.toBinaryString(numB),
            Integer.toBinaryString(numC))); // 2)
   }
}
1) 변수 numA, numB, numC를 출력하는 문장으로 numC = numA & numB를 AND 연산하여 저장한 값이다,
   - 3 & 2 = 2
2) 1)의 결과가 어떻게 나오는지 확인하기 위해서 변수 numA, numB, numC를 2진수로 표시하기 위해 Integer.toBinaryString API를 사용해서 각각 출력한 것입니다. 
  -> 11 & 10 = 10
  -> 3 & 2는 2진수로 11 & 10이면 AND 연산을 하면 10으로 십진수로 변환하면 2입니다.

public class BitOperator {
   public static void main(String[] args) {
      int numA = 3;
      int numB = 2;

      System.out.println(String.format("%s | %s = %s",
               Integer.toBinaryString(numA),
               Integer.toBinaryString(numB),
               numA | numB));  // 1)

      System.out.println(String.format("십진수 : %s\n 이진수 : %s\n 8진수 : %s\n 16진수 : %s",
               10,
               Integer.toBinaryString(10),
               Integer.toOctalString(10),
               Integer.toHexString(10))); // 2)

      System.out.println( String.format("십진수 : %s\n 십진수 : %s\n 십진수 : %s\n 십진수 : %s",
               100,
               Integer.parseInt("1010",2),
               Integer.parseInt("12",8),
               Integer.parseInt("a",16))       ); // 3)

      System.out.println(String.format("~%s = %s",
               Integer.toBinaryString(numA),
               ~numA )); // 4)
   }
}
1) numA | numB를 OR 연산을 한 것으로 결과 : 11 | 10 = 3 
2) 십진수 2를 이진수, 8진수, 16진수로 변환한 것으로 각각 Integer.toBinaryString(10), Integer.toOctalString(10), Integer.toHexString(10)을 사용합니다.
3) 이진수, 8진수, 16진수를 10진수로 변환하기 위해 Integer.parseInt를 사용하는데 두 번째 인자가 진법입니다.
-> Integer.parseInt("문자",진법) => Integer.parseInt("1010",2) : 1010 이진수를 10진수로 변환
4) Bit 부정 연산을 입니다. : ~11 = -4
-> 처리 과정 :
   -> 십집수 3
   -> 이진수 11의 메모리 값은  int(4Byte) 값 : 00000000 00000000 00000000 0000 0011
   -> ~ 부정 연산 처리 후 메모리 값  : 11111111 11111111 11111111 11111100   
   -> 십진수로  -4                      

 

'Java > 기본' 카테고리의 다른 글

023. 자바 : 비교연산자  (0) 2022.03.06
022. 자바 : 시프트연산자  (0) 2022.03.06
020. 자바 : 증감연산자  (0) 2022.03.06
019. 자바 : 산술연산자  (0) 2022.03.06
018. 자바 : 대입 연산자  (0) 2022.03.06