본문 바로가기

개발 일기/Java Programming

비트 연산자 | 비트 논리곱 연산자 & | 비트 논리합 연산자 | | 비트 배타적 논리합 연산자 ^ | 비트 부정 연산자 ~ | 왼쪽 시프트 연산자 << | 오른쪽 시프트 연산자 >>

비트 연산자

 

1. 비트 연산자

a. 정수나 문자 등을 2진수로 변환한 다음 각 자리의 비트끼리 연산을 수행한다

비트 연산자 설명 의미
& 비트 논리곱 연산자(AND) 둘 다 1이면 1
| 비트 논리합 연산자(OR) 둘 중 하나면 1이면 1
^ 비트 배타적 논리합 연산자(XOR) 둘이 같으면 0이고, 둘이 다르면 1
~ 비트 부정 연산자 1은 0으로 바꾸고, 0은 1로 바꿈
<< 왼쪽 시프트 연산자 비트를 왼쪽으로 시프트
>> 오른쪽 시프트 연산자 비트를 오른쪽으로 시프트

1 - true / 0 - false

 

2. 비트 논리곱 연산자 &

a. '10 & 7'

ㄱ. 10진수를 2진수로 변환한 다음 각 비트마다 AND 연산을 수행

ㄴ. 결과 - 2진수로는 0010₂, 10진수로는 2

A B A&B
0 0 0
0 1 0
1 0 0
1 1 1

public class EX04_09 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.printf(" 10 & 7 = %d \n", 10 & 7); //10과 7의 논리곱을 수행
		System.out.printf(" 123 & 456 = %d \n", 123 & 456); //123과 456의 비트 논리곱을 수행
		
		System.out.printf(" 0xFFFF & 0000 = %d \n", 0xFFFF & 0000); //10진수 FFFF와 0의 비트 논리곱을 수행
	}

}

10 & 7 = 2

123 & 456 = 72

0xFFFF & 0000 = 0

 

3. 비트 논리합 연산자 |

a. '10 | 7'

A B A | B
0 0 0
0 1 1
1 0 1
1 1 1

비트 논리합의 결과는 1111₂이고, 이는 10진수로 15

public class EX04_10 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.printf(" 10 | 7 = %d \n", 10 | 7); //10과 7의 비트 논리합을 수행
		System.out.printf(" 123 | 456 = %d \n", 123 | 456); //123과 456의 비트 논리합을 수행
		
		System.out.printf(" 0xFFFF | 0000 = %d \n", 0xFFFF | 0000); //16진수 FFFF와 0의 비트 논리합을 수행
	}

}

10 | 7 = 15

123 | 456 = 507

0xFFFF | 0000 = 65535

 

4. 비트 배타적 논리합 연산자 ^

a. 두 값이 다르면 1, 같으면 0이 됨. 즉 1^1이나 0^0이면 결과가 거짓(0)이고, 1^0이나 0^1이면 결과가 참(1)

b. 10^7

A B A^B
0 0 0
0 1 1
1 0 1
1 1 0

비트 배타적 논리합 결과는 1101₂이고, 이는 10진수로 13

public class EX04_11 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.printf(" 10^7 = %d \n", 10^7); //10과 7의 비트 배타적 논리합을 수행
		
		System.out.printf(" 123^456 = %d \n", 123^456); //123과 456의 비트 배타적 논리합을 수행
		
		System.out.printf(" 0xFFFF^0000 = %d \n", 0xFFFF^0000); //16진수 FFFF와 0의 비트 배타적 논리합을 수행
	}

10^7 = 13

123^456 = 435

0xFFFF^0000 = 65535

5. 비트 부정 연산자 ~

a. 각 비트를 반대로 만드는 연산자.0은 1로 바꾸고, 1은 0으로 바꿈. 이렇게 반전된 값을 1의 보수라 하며, 그 값에 1을 더한 값을 2의 보수라 함. 비트 부정 연산자는 해당 값의 음수(-)값을 찾고자 할 때 사용.

public class EX04_12 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 12345;
		
		System.out.printf(" %d \n", ~a + 1); //a 값의 2의 보수를 구함. ~a+1->음수
	}

}

-12345

6. 왼쪽 시프트 연산자 <<

a. 나열된 비트를 왼쪽으로 시프트(shift)

b. 26을 왼쪽으로 두 칸 시프트 연산

public class EX04_13 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 10;
		System.out.printf("%d 를 왼쪽 1회 시프트하면 %d 이다. \n", a, a<<1); //a(시프트할값)<<1(횟수(칸수))
		System.out.printf("%d 를 왼쪽 2회 시프트하면 %d 이다. \n", a, a<<2);
		System.out.printf("%d 를 왼쪽 3회 시프트하면 %d 이다. \n", a, a<<3);
	}

}

10 를 왼쪽 1회 시프트하면 20 이다.

10 를 왼쪽 2회 시프트하면 40 이다.

10 를 왼쪽 3회 시프트하면 80 이다.

 

10*2¹ / 10*2² / 10*2³

 

0011(₂)을 왼쪽으로 시프트 -> 10진수는?

-> 3*2¹=6

 

7. 오른쪽 시프트 연산자 >>

a. 나열된 비트를 오른쪽으로 시프트하는 연산자

b. 26을 오른쪽으로 두 칸 시프트 연산

 

public class EX04_14 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 10;
		
		System.out.printf("%d 를 오른쪽 1회 시프트하면 %d 이다. \n", a, a>>1);
		System.out.printf("%d 를 오른쪽 2회 시프트하면 %d 이다. \n", a, a>>2);
		System.out.printf("%d 를 오른쪽 3회 시프트하면 %d 이다. \n", a, a>>3);
		System.out.printf("%d 를 오른쪽 4회 시프트하면 %d 이다. \n", a, a>>4);
	}

}

10 를 오른쪽 1회 시프트하면 5 이다.

10 를 오른쪽 2회 시프트하면 2 이다.

10 를 오른쪽 3회 시프트하면 1 이다.

10 를 오른쪽 4회 시프트하면 0 이다.

0011(₂)  오른쪽 1칸 시프트 -> 10진수는?

-> 3/2¹=1

 

public class EX04_15 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 100, result;
		int i;
		
		for (i = 1; i <=5; i++) { //왼쪽 시프트 연산을 다섯 번 반복해서 출력. 반복문(시작값;종료값;증감값)
			result = a<<i; //1부터5까지가i에저장. for문을썼기때문에
			System.out.printf("%d << %d = %d \n", a, i, result);
		}
		
		for (i=1; i<=5; i++) { //오른쪽 시프트 연산을 다섯 번 반복해서 출력. i<100이라고적으면실제로100번가능
			result = a>>i;
		System.out.printf("%d >> %d = %d \n", a, i, result);
		}
	}

100 << 1 = 200

100 << 2 = 400

100 << 3 = 800

100 << 4 = 1600

100 << 5 = 3200 _까지 *2의n제곱

100 >> 1 = 50

100 >> 2 = 25

100 >> 3 = 12

100 >> 4 = 6

100 >> 5 = 3 /2의n제곱