오늘은 Bit의 논리 연산과 시프트 연산에 대해 정리해 보겠습니다.
Bit논리연산을 알아보기전에,
Bit가 무엇인지부터 알아보겠습니다.
1. Bit = Binary Digit
Bit는 Binary Digit의 약자입니다.
컴퓨터에서 사용하는 가장 작은 단위 데이터 단위입니다.
Binary가 2개를 의미히고,
digit은 자리를 의미하지요.
이 둘을 합치면 2개의 자리수라는 뜻이 됩니다.
실제로 여기서 말하는 것은,
2개의 진수인 0과 1입니다.
2진수를 구하는 방법은 다른 글에서 정리를 하구요.(특히 음수를 표현하는 방법은 따로 정리할 필요가 있을 것 같네요.)
오늘은 자바의 toBinaryString()메소드를 이용해,
10진수인 88의 Binary값(즉, 2진수)를 뽑아보겠습니다.(Kotlin에서도 동일한 함수명이 있습니다)
* 참고로 자바에서 8진수는 toOctalString(int)으로, 16진수는 toHexString(int) 메소드로 얻어올 수 있습니다.)
원래는 2로 더이상 나누어지지 않을 때까지,
나누어서 나온 나머지들을 역순으로 나열해야 하는데요.
자바의 함수를 이용해 바로 값을 얻을 수 있습니다.
결과 값으로, 다음과 같이 1011000이 출력됩니다.
참고로 비트는 위와 같이 2진수인 0과 1만을 사용하기 때문에,
float나 double에서는 사용할 수 가 없습니다.
이제 비트가 무엇인지는 알았으니, 비트 연산자에 대해 정리해보겠습니다.
2. Bit 연산자 2가지
비트 연산자는 크게 논리 연산자와 비트 이동 연산자(시프트 연산자)로 구분할 수 있는데요.
하나씩 보도록 하겠습니다.
2-1. Bit 논리 연산자
비트의 논리 연산자는, 4가지가 있는데요.
아래와 같습니다.
- & : 논리곱(AND), 두 비트 모두 1일 경우만 1이 됩니다.
- | : 논리합(OR), 두 비트중 하나만 1이면 연산 견과는 1이 됩니다.
- ^ : 배타적 논리합(XOR), 두비트 중 하나만 1일 경우만, 1이 됩니다.(둘다 1이라면, 배타적 논리합에서는 0이 되네요.)
- ~ : 논리 부정(NOT), 1의 보수를 가르키는데요. 0이면 1이고, 1이면 0이 됩니다.
- 참고로 보수(Complement)는 보충해 주는 수라는 뜻이구요, 예를 들면, 3에 대한 10의 보수는 7이 됩니다.
논리곱은 프로그래밍 할 때, && 을 이용하면서 많이 익숙하실 텐데요.
논리합인 OR과 배타적 논리합인 (XOR) 은 표로 보면서 이해해 보겠습니다.
A. 논리합 OR(|) 연산
먼저 OR을 표로 볼까요.
OR 연산은 두 비트 중 하나라도 1이면,
결과가 1이 됩니다.
그래서 주로 조건을 결합하거나 여러 옵션을 확인할 때 사용됩니다.
대표적으로 안드로이드의 Intent를 결합해서 사용할 때 사용합니다.
A | B | A OR B |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
B. XOR(^)
XOR (배타적 논리합) 연산자는 두 개의 비트가,
서로 다를 때만 1을 반환하는 연산입니다.
둘다 1이거나 0일 때는 0이되고,
둘중의 하나만 1일때, 1이 되는 것입니다.
표를 보겠습니다.
A | B | A XOR B |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
조금은 특이한 XOR 연산은,
주로 데이터 암호화, 오류 검출 및 수정, 그리고 비트 조작에 사용됩니다.
XOR은 동일한 값을 두 번 XOR하면 원래 값으로 돌아오기 때문에,
여러 알고리즘에서 사용되고 있기도 합니다.
2-2. Bit 시프트(이동) 연산자
시프트 연산은, 비트를 좌측이나 우측으로 밀어서 이동시키는 연산을 의미하는데요.
A. a<<b
먼저 a<<b 에 대해 보겠습니다.
- a의 비트들을, 왼쪽으로 b만큼 이동하는 것을 의미. 이 때, 빈자리는 0으로 채워짐
- 예) 8 << 3 이라고 한다면, 8은 2진수로 1000 이므로, 각 비트를 세자리씩 좌측으로 옮겨서, 10000000 이 됩니다.
- 정수로는 8*2^3 = 64
- 따라서, 한칸 이동시 2의 n승배만큼 증가한다는 것을 알 수 있음
- 예) 8 << 3 이라고 한다면, 8은 2진수로 1000 이므로, 각 비트를 세자리씩 좌측으로 옮겨서, 10000000 이 됩니다.
- 공식으로 표현하면 a * 2^( b ) 와 같음
(비트가 0과 1로 되어 있기 때문에 2의 b승만큼 곱해지게 되는 것입니다. 참고로 2^3= 2*2*2 처럼 exponent를 의미합니다.)
a>>b 에 대해서도 보겠습니다.
b. a>>b
- a의 비트들을 오른쪽으로 b만큼 이동하는 것을 의미
- 빈자리는 가장 앞자리 비트(음수, 양수를 표현하는 최상위 비트)와 같은 값으로 채워줍니다.
- 예) 예> -8 >> 3이라고 한다면,
11111111111111111111111111111000(32bit)을 우측으로 3자리만큼 옮겨,
11111111111111111111111111111111 이 됨
- 예) 예> -8 >> 3이라고 한다면,
- 한칸 이동시에는 2의 n승배만큼 감소
- 공식으로 표현하면 a / 2^( b ) 와 같음. (결과로 나온, 소수점값은 버립니다.)
c. a>>>b
a>>>b가 a>>b 연산과 다른점은,
a의 비트를 b만큼 오른쪽으로 이동시키되, 빈자리는 0으로 채우는 것을 의미합니다.
이상으로 Bit의 논리 연산자와 시프트 연산자에 대해서 간단히 정리해 보았습니다.
'Android 개발 > Java, Java8' 카테고리의 다른 글
Enum값에 대해서 알아보겠습니다 (0) | 2018.04.10 |
---|---|
정규 표현식 (Regular Expression) 과 응용 사례를 정리해 보자 (1) | 2017.09.07 |
Math 클래스 의 반올림, 올림, 버림 등 자주 사용하는 메소드 정리 #Java (0) | 2017.04.09 |
Matcher 클래스와 Pattern Class로 정규 표현식을 활용해보자 (0) | 2017.03.22 |
Java 배열 및 ArrayList 를 Comparable과 Comparator 를 이용해 정렬하기 (0) | 2017.03.19 |
Java Wrapper 클래스 를 정리해 보자 (0) | 2017.03.07 |
Java Map인 HashMap, TreeMap, LinkedHashMap 에 대해서 정리해 보자. (0) | 2017.02.12 |
Java의 3항 연산자는 알아야, 소스코드도 보인다 (0) | 2017.01.21 |
Java IO에서 InputStream, OutputStream, Reader, Writer (0) | 2017.01.07 |
JAVA Interface 안드로이드를 위한 자바 인터페이스 #다중상속 #콜백 (0) | 2016.12.21 |
댓글