본문 바로가기
Android 개발/Java

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

by Developer88 2017. 3. 16.
반응형

오늘은 bit의 논리 연산과 시프트에 대해서, 정리해 보려고 하는데요.

Bit가 대체 무엇인지 먼저 알아보겠습니다.



1. Bit = Binary Digit


Bit는 Binary Digit의 약자인데요.

컴퓨터에서 사용하는 가장 작은 단위 데이터 단위입니다.


Binary가 2개를 의미히고, digit은 자리를 의미해서,

합쳐서 2개의 자리수라는 뜻인데요. 

여기서 의미하는 2개의 진수는 0과 1을 가르킵니다.


2진수를 구하는 방법은 다른 글에서 정리를 하구요.(특히 음수를 표현하는 방법은 따로 정리할 필요가 있을 것 같네요.)

오늘은 자바에서 제공하는 toBinaryString()메소드를 이용해서, 10진수인 88의 Binary값(즉, 2진수)를 뽑아보겠습니다.

(참고로, 자바에서 8진수는 toOctalString(int)으로, 16진수는 toHexString(int)  메소드를 사용하면 값을 얻어올 수 있습니다.)


원래는 2로 더이상 나누어지지 않을 때까지, 나누어서 나온 나머지들을 역순으로 나열해야 하는데요.

자바의 API가 제공해주고 있으니, 편리하네요.




결과 값으로, 다음과 같이 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이 됩니다.
논리곱이나 논리합은 &&이나 ||을 쓰면서 많이 익숙하실거구요.
배타적 논리합(XOR) 정도가 익숙하지 않으실 수도 있는데요.  
둘다 1이거나 0일 때는 0이되고, 둘중의 하나만 1일때, 1이 되는 것입니다. 


2-2. Bit 시프트(이동) 연산자


비트를 좌측이나 우측으로 밀어서 이동시키는 연산을 의미하는데요.

  • a << b
    •  a의 비트들을, 왼쪽으로 b만큼 이동하는 것을 의미합니다. 이 때, 빈자리는 0으로 채워지게 됩니다.
    • 예> 8 << 3 이라고 한다면, 8은 2진수로 1000 이므로, 각 비트를 세자리씩 좌측으로 옮겨서, 10000000 이 됩니다. 
      • 정수로는,  8*2^3 = 64가 되겠네요.
    • 공식으로 표현하면 a * 2^( b ) 와 같습니다. (비트가 0과 1로 되어 있기 때문에 2의 b승만큼 곱해지게 되는 것입니다. 참고로 2^3= 2*2*2 처럼 exponent를 의미합니다.) 
      • 따라서, 한칸 이동시 2의 n승배만큼 증가합니다.
  • a >> b
    • 반대로, a의 비트들을 오른쪽으로 b만큼 이동하는 것을 의미합니다. 이 때, 빈자리는 가장 앞자리 비트(음수, 양수를 표현하는 최상위 비트)와 같은 값으로 채워줍니다.
    • 예> -8 >> 3이라고 한다면, 11111111111111111111111111111000(32bit)을 우측으로 3자리만큼 옮겨서 11111111111111111111111111111111 이 됩니다. 
      • 보시는 것처럼, 우측으로 이동하고나서 가장 좌측에는 가장 앞자리 비트와 같은 1이 채워집니다.
    • 공식으로 표현하면 a / 2^( b ) 와 같습니다. (결과로 나온, 소수점값은 버립니다.)
      • 한칸 이동시에는 2의 n승배만큼 감소합니다.
  • a >>> b 
    • a>>b 연산과 다른점은, a의 비트를 b만큼 오른쪽으로 이동시키되, 빈자리는 0으로 채우는 것을 의미합니다.

Bit의 논리 연산자와 시프트 연산자에 대해서 간단히 정리해 보았는데요.
다음 글에서, 이를 응용해서 사용하는 방법에 대해 보도록 하겠습니다.


728x90

댓글