[개발 기본 개념]비트 연산자

2023. 5. 26. 13:42개발/개념 및 기법

728x90
반응형

 

비트연산자란? 컴퓨터의 비트 단위로 데이터를 처리하는 연산자

비트연산자   예시 설명
& AND 0 & 0 == 0
0 & 1 == 0
1 & 1 == 1
두 비트의 값이 모두 1인 경우에만 1을 반환
| OR 0 | 0 == 0
0 | 1 == 1
1 | 1 == 1
두 비트 중 하나라도 1인 경우에는 1을 반환
^ XOR 0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 1 == 0
두 비트가 서로 다른 경우에 1을 반환
~ NOT ~0 == 1
~1 == 0
0이면 1을, 1이면 0을 반환
<< LEFT SHIFT a << b 비트를 왼쪽으로 지정된 수(b)만큼 이동
오른쪽에 0이 추가되고, 왼쪽에서 벗어나는 비트는 버려짐
>> RIGHT SHIFT a >> b 비트를 오른쪽으로 지정된 수(b)만큼 이동
왼쪽에는 부호 비트가 추가되고, 오른쪽으로 벗어나는 비트는 버려짐
>>> UNSIGNED RIGHT SHIFT a >>> b 비트를 오른쪽으로 지정된 수만큼 이동
왼쪽에는 항상 0이 추가되고, 오른쪽으로 벗어나는 비트는 버려짐

AND 연산자 ( & )

두 비트의 값이 모두 1인 경우에만 1을 반환한다.

51 & 85 = 17

  0 0 1 1 0 0 1 1
& 0 1 0 1 0 1 0 1
= 0 0 0 1 0 0 0 1

OR 연산자 ( | )

두 비트 중 하나라도 1인 경우에는 1을 반환한다.

51 | 85 = 77

  0 0 1 1 0 0 1 1
| 0 0 1 0 1 0 1 0
= 0 1 1 1 0 1 1 1

XOR 연산자 ( ^ )

두 비트가 서로 다른 경우에 1을 반환한다.

51 ^ 85 = 66

  0 0 1 1 0 0 1 1
^ 0 1 0 1 0 1 0 1
= 0 1 1 0 0 1 1 0

NOT 연산자 ( ~ )

0이면 1을, 1이면 0을 반환한다.

~85 = 170

~ 0 1 0 1 0 1 0 1
= 1 0 1 0 1 0 1 0

Left Shift 연산자 ( << )

비트를 왼쪽으로 지정된 수만큼 이동하며, 오른쪽에 0이 추가되고, 왼쪽에서 벗어나는 비트는 버려진다.

51 << 3 = 408

<< 3   0 0 1 1 0 0 1 1
= 1 1 0 0 1 1 0 0 0

Right Shift 연산자 ( >> )

비트를 오른쪽으로 지정된 수만큼 이동하며, 왼쪽에는 부호 비트(최상위 비트(MSB))가 추가되고, 오른쪽으로 벗어나는 비트는 버려진다.

아래 예시에서 -51은 음수이므로 최상위 비트는 1이며 왼쪽에 1이 추가된다.

-51 >> 3 = -7

>> 3 1 1 0 0 1 1 0 1
= 1 1 1 1 1 0 0 1

위 예시에서 11110011 은 2의 보수를 제거하면 11110010이며, 다시 1의 보수를 제거하면 00001101이 된다. 따라서 00001101인 13에 - 가 붙어 -13이다.

혹은 2^7 + 2^6 + 2^5 + 2^4 + 0 + 0 + 2^1 + 2^0 로 계산할 수 있다.

Unsigned Right Shift 연산자 ( >>> )

비트를 오른쪽으로 지정된 수만큼 이동하며, 왼쪽에는 항상 0이 추가되고, 오른쪽으로 벗어나는 비트는 버려진다.

Right Shift 연산자와 차이점은 부호가 없다는 점이다.

-51 >>> 3 = 25

>>> 3 1 1 0 0 1 1 0 1
= 0 0 0 1 1 0 0 1

Right Shift 연산자 와 Unsigned Right Shift 연산자 의 차이점

논리 오른쪽 시프트 연산은 부호를 고려하지 않고 오른쪽으로 이동하며, 양수와 음수에 모두 적용될 수 있다.

이 연산자는 자바와 같은 몇몇 프로그래밍 언어에서 사용되며, 주로 부호 없는 정수(unsigned integer)의 논리 연산에 활용된다.

728x90
반응형

'개발 > 개념 및 기법' 카테고리의 다른 글

JVM이란?  (1) 2025.01.23
Java에서 try~catch문, 남용하면 문제 없을까?  (0) 2024.07.30
참조  (1) 2023.02.24
Interface(인터페이스)  (0) 2021.07.26
객체지향 프로그래밍 - 01. 추상화  (0) 2021.07.26