JAVA

비트단위 논리연산

jmeen 2021. 8. 21. 20:42
728x90

 

비트 단위 논리연산

X & Y X와 Y의 비트단위 논리 곱을 생성
X | Y X와 Y의 비트단위 논리합을 생성
X ^ Y X와 Y의 비트단위 배타적 논리합을 생성
~y y의 모든 비트단위를 반전한 값을 생성

 

1. 논리곱 ( X & Y )

비트 두개를 놓고, 두 수를 곱해 1이 되어야 1이다.

X Y X & Y
0 0 0
0 1 0
1 0 0
1 1 1

 

2. 논리합 ( X | Y )

비트 두개를 더해 1이 되면 1이다. 두개 모두 1이어도 1이다.

X Y X | Y
0 0 0
0 1 1
1 0 1
1 1 1

 

3. 배타적 논리합 ( X ^ Y )

두개의 비트중에 하나만 1이어야 1이다. 

두 비트 모두 1이면 0이 된다.

X Y X ^ Y
0 0 0
0 1 1
1 0 1
1 1 0

 

4. 논리 부정

무조건 반대인 것을 작성한다.

X ~X
1 0
0 1

 


1. pos번째의 비트를 1로 바꾼 값 구하기

5번째 비트가 1로 변경한걸 구해라.

0001 1010 0110
1 0000 0000 0001
1<<5 0000 0001 0000
x | (1<<5) 0001 1011 0110

 

2. pos 번째의 비트를 0으로 바꾼 값 구하기

- 특정 자리의 비트를 0으로 만들고, 논리곱을 한다.

- 논리곱 : 두개의 비트를 곱해 1이 나와야 1

0001 1010 0110
1 0000 0000 0001
~(1<<5) 1111 1110 1111
x & ~(1<<5) 0001 1010 0110

3. post번째의 비트를 반전시킨 값 구하기

- 특정자리의 비트의 반전 값을 반환한다.

0001 1010 0110
1 0000 0000 0001
(1<<5) 0000 0001 0000
x  ^ (1<<5) 0001 1011 0110

post번째부터 n번째까지 연속된 값 바꾸기

- for를 사용하는것이 아니다. 아래와 같은 순서로 공식을 만들어 사용한다.

이것을 이용해 1로 바꾸거나, 0으로 바꾸거나, 반전시키거나 응용하여 사용할 수 있다.

0 0000 0000 0000 0000
~0 1111 1111 1111 1111
~0 << 5 1111 1111 1110 0000
~(~0 << 5) 0000 0000 0001 1111
~(~0 << 5) << 5 0000 0011 1110 0000