본문 바로가기

개발/JAVA

[JAVA] #09. 비트 연산자(bitwise operator), 시프트 연산자

■ 비트 연산자(bitwise operator)

비트 연산자는 논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자입니다.

또한, 비트 단위로 왼쪽이나 오른쪽으로 전체 비트를 이동하거나, 1의 보수를 만들 때도 사용됩니다.

package main;

​

public class mainClass {

​

public static void main(String[] args) {

​

// bit Operator

// 고급 연산자라고 생각하면 좋다

// 연구개발, 리서치 부분에선 중요한 부분이다

// 처리 속도 및 연산 속도가 빠르다

// 기술 면접에서 많이 나왔던 부분

​

/*

bit : 0, 1

​

& AND

| OR

^ XOR *** -> 보안쪽에서 자주 사용되는 연산, 두 값의 각 자릿수를 비교해,값이 0으로 같으면 0, 값이 1로 같으면 0, 다르면 1을 계산한다.

<< left shift *

>> right shift

~ 반전

​

(1) 1010 1100

A C

​

1111 0000

F 0 => 1로 채워져 있으면 볼 것도 없이 F이다. = 15(10진수) = 1111(2진수)

​

​

(2) 1010 0000

A 0

​

*/

​

// AND

​

int result;

​

result = 0xAC & 0xF0;

System.out.println("result = " + result); // 출력은 10진수로 바뀌어서 될 것임 => (1)

System.out.printf("0x%x\n", result); // (2)

​

​

// OR

​

result = 0x48 | 0xB4;

System.out.println("result = " + result);

System.out.printf("0x%x\n", result);

​

​

// XOR c4 78

​

result = 0xC4 ^ 0x78;

System.out.println("result = " + result);

System.out.printf("0x%x\n", result);

​

​

// 반전 (~, 틸드) 0 -> 1 , 1 -> 0 NOT , 자료형 byte를 사용해야 잘 잡을 수 있다

​

byte by = ~0x55; // 0101 0101 -> 1010 1010

// A A

System.out.printf("0x%x \n", by);

​

​

​

////////////////////////////////////////////////////////

​

// left shift (*2) ==> 시프트 연산이 빠르다

/*

0000 0001 -> 1

0000 0010 -> 2

0000 0100 -> 4

8421 8421 (한 칸씩 밀면서 x2가 되는 것을 볼 수 있다, right는 /2로 반대로 된다)

*/

​

byte by1;

by1 = 0x1 << 1; // (0001을 시프트 연산으로 1만 민다)

System.out.println("by1 =" + by1);

​

​

by1 <<= 1; // 0010

System.out.println("by1 =" + by1);

​

by1 <<= 1; // 0100

System.out.println("by1 =" + by1);

​

// right shift (/2)

​

by1 >>= 1; //

System.out.println("by1 =" + by1);

​

​

// 예전에 나왔던 기술문제

// num1 = 0x12;

// num2 = 0x34;

// number = ~(num1 & ~num2)

​

​

result = ~(0x12 & 0x34);

System.out.println("result = " + result);

System.out.printf("0x%x\n", result);

​

// 다시 해보기

​

}

​

}