elesis's haunt

[Java] 비트 연산자_시프트 연산 본문

프로그래밍 언어/Java

[Java] 비트 연산자_시프트 연산

elesis 2022. 3. 29. 03:11

비트 연산자

비트 단위(0, 1)로 연산합니다.

기능에 따라 비트 이동연산자, 비트 논리연산자로 나뉩니다.

 

1. 비트 이동연산자

연산식 설명
x << y 정수 x의 각 비트를 y만큼 왼쪽으로 이동시킵니다. (빈자리는 0으로 채워집니다.)
x >> y 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킵니다. (빈자리는 정수의 최상위 부호비트와 같은 값으로 채워집니다.)
x >>> y 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킵니다. (빈자리는 0으로 채워집니다.)

ex)

더보기

 x << y

int calInt = 3;   // 0011 
byte calByte = 3; // 0011

// 왼쪽으로 3칸 이동
System.out.println(calInt<<2);  // 1100 = 12
System.out.println(calByte<<2); // 12
System.out.println(3<<2);       // 12

x >> y

int calInt = -20;   //  10100 = 16+4 = 20
byte calByte = -20; // 101100 = -32+8+4 = -20, +20의 보수(1100)에 맨앞 음수표시를(1) 달면 음수변환.

// 오른쪽으로 2칸 이동
System.out.println(calInt>>2);  // 1011 = -8+2+1 = -5
System.out.println(calByte>>2); // -5
System.out.println(-20>>2);     // -5

x >>> y

int calInt = -20;   //  00000000 00000000 00000000 00010100 = 20을 32비트(int)로 분해한 다음 
byte calByte = -20; //  11111111 11111111 11111111 11101100 = -20으로 음수전환

// 오른쪽으로 2칸 이동
System.out.println(calInt>>>2);  // 00111111 11111111 11111111 11111011 = 1073741819
System.out.println(calByte>>>2); // 1073741819
System.out.println(-20>>>2);     // 1073741819

 

* int는 32bit지만 맨앞 비트는 부호 역할을 하므로 양수는 0, 음수는 1, 최소값은 -2^31, 최대값은 2^31-1 입니다.

* 32비트로 분해를 마지막 예제에서만 했는데 앞의 두 예제도 다 합니다. 다 볼 필요가 없어서 생략했습니다.

 

2. 비트 논리연산자

연산자 논리 설명
& AND(논리곱) 두 비트 모두 1일 경우 연산결과 1
| OR(논리합) 두 비트 중 하나라도 1일 경우 연산결과 1
^ XOR(배타적 논리합) 두 비트중 하나는 1이고 다른하나가 0일 경우 연산결과 1
~ NOT(논리 부정) 비트 반전(보수)

ex)

더보기

AND

0110
0010
----
0010 // 2

OR

0110
0010
----
0110 // 6

XOR

0110
0010
----
0100 // 4

NOT

0110
----
1001 // -7

* NOT연산을 하면 비트가 반전되지만 반전된 비트는 왼쪽끝이 1이기 때문에 컴퓨터는 음수로 인식한다.

Comments