본문 바로가기
자바공부/연산자

JAVA(자바) - 이항 연산자 5.비트 연산자(&, |, ^, ~, <<, >>, >>>)

by You진 2021. 1. 16.

5.비트 연산자(&, |, ^, ~, <<, >>, >>>)

-비트(bit)단위로 연산을 한다. 즉 0과 1이 피연산자가 된다.

 ● 0과 1로 표현이 가능한 정수 타입만 비트 연산을 할 수 있다.

 ● 실수 타입인 float과 double은 비트 연산을 할 수 없다.

 

-종류

 ● 비트 논리 연산자(&, |, ^, ~)

 ● 비트 이동 연산자(<<, >>, >>>)

 

첫번째 종류에 대해 알아봅시다.

-비트 논리 연산자(&, |, ^, ~)

 ● 피 연산자가 boolean타입일 경우 -> 일반 논리 연산자

 ● 피 연산자가 정수 타입일 경우 비트 논리 연산자

구분 연산식 결과 설명
AND
(논리곱)
1 & 1 1 두 비트가 모두 1일 경우에만 1이다
1 0 0
0 1 0
0 0 0
OR
(논리합)
1 | 1 1 두 비트 중 하나만 1이여도 1이다
1 0 1
0 1 1
0 0 0
XOR
(배타적
논리합)
1 ^ 1 0 두 비트 중 하나는 1 이고 다른 하나가 0 일 경우 1이다
1 0 1
0 1 1
0 0 0
NOT
(논리부정)
  ~ 1 0 부정하다 (반대)
  0 1

 ● 비트 연산자는 피연산자를 int타입으로 자동 타입 변환한 후 연산을 수행한다.

    byte, short, char타입을 비트 논리 연산하면 그 결과는 int 타입이 된다.

    다음은 컴파일 에러가 난다.

byte num1 = 45;
byte num2 = 25;
byte result = num1 & num2; //컴파일 에러 -> int result = num1 & num2;

 

 

	public static void main(String[] args) {
		System.out.println("45&25=" + (45 & 25));
		System.out.println("45|25=" + (45 | 25));
		System.out.println("45^25=" + (45 ^ 25));
		System.out.println("~45=" + (~45));
		
		System.out.println(toBinaryString(45));
		System.out.println("&");
		System.out.println(toBinaryString(25));
		System.out.println("||");
		System.out.println(toBinaryString(45&25));
	}
	public static String toBinaryString(int value) {
		String str = Integer.toBinaryString(value);
		while (str.length() < 32) {
			str = "0" + str;
		}
		return str;
	}
	실행 후 결과 값:
	45 & 25 = 9
	45 | 25 = 61
	45 ^ 25 = 52
	~45 = -46
	00000000000000000000000000101101
	&
	00000000000000000000000000011001
	||
	00000000000000000000000000001001

 

두번째 종류에 대해 알아봅시다.

-비트 이동(쉬프트) 연산자(<<,>>,>>>)

 ● 정수 데이터의 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행

구분 연산식 설명
이동
(쉬프트)
a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동
(빈자리는 0으로 채워진다)
a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동
(빈자리는 정수 a의 최상위 부호비트(MSB)와 같은 값으로 채워진다)  ※MSB : 양수는 0이고 음수는 1이다
a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동
(빈자리는 0으로 채워진다)
	public class BitShiftExample {

	public static void main(String[] args) {
		System.out.println("1<<3= " + (1 << 3));
		System.out.println("-8>>3= " + (-8 >> 3));
		System.out.println("-8>>>3= " + (-8 >>> 3));
		System.out.println();
		System.out.println(toBinaryString(-8));
		System.out.println(">>3=");
		System.out.println(toBinaryString(-8 >> 3));
		System.out.println();
		System.out.println(toBinaryString(-8));
		System.out.println(">>>3=");
		System.out.println(toBinaryString(-8 >>> 3));
	}

	public static String toBinaryString(int value) {
		String str = Integer.toBinaryString(value);
		while (str.length() < 32) {
			str = "0" + str;

		}
		return str;
	}
	실행 후 결과 값:
	1<<3= 8
	-8>>3= -1
	-8>>>3= 536870911

	11111111111111111111111111111000
	>>3=
	11111111111111111111111111111111

	11111111111111111111111111111000
	>>>3=
	00011111111111111111111111111111