본문 바로가기
Android 개발/Java, Java8

Bit 논리 연산과 시프트 연산 의 정리

by Developer88 2017. 3. 16.
반응형

오늘은 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승배만큼 증가한다는 것을 알 수 있음
  • 공식으로 표현하면 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 이 됨
  • 한칸 이동시에는 2의 n승배만큼 감소
  • 공식으로 표현하면 a / 2^( b ) 와 같음. (결과로 나온, 소수점값은 버립니다.)

 

c. a>>>b

a>>>b가 a>>b 연산과 다른점은,

a의 비트를 b만큼 오른쪽으로 이동시키되, 빈자리는 0으로 채우는 것을 의미합니다.

 

이상으로 Bit의 논리 연산자와 시프트 연산자에 대해서 간단히 정리해 보았습니다.

728x90

댓글