검수요청.png검수요청.png

"비트연산자"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
잔글
 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
5번째 줄: 5번째 줄:
  
 
== 특징 ==
 
== 특징 ==
=== 논리 연산자 ===
+
=== 논리 연산자 ===  
 +
<ref name="비트연산자종류">〈[https://rockykim5581.tistory.com/19 비트 연산자의 종류]〉, 《김로키》</ref>
 
:{|class=wikitable width=1000 style="background-color:#ffffee"
 
:{|class=wikitable width=1000 style="background-color:#ffffee"
 
|+비트 연산자
 
|+비트 연산자
27번째 줄: 28번째 줄:
 
|}
 
|}
  
==== AND 연산자 ====
+
 
 
논리 연산자는 (&,│,^,~)로 이루어져 있으며 비트 논리 연산자는 그 대상이 boolean타입일 경우에는 일반 논리 연산자로 활용되지만 대상이 정수형일 경우에는 위의 표와 같이 비트 논리연산자로 활용한다. 비트 연산은 두 값을 비트 단위로 나열한 뒤 각 자릿수를 비트 연산자로 연산한다. 각 자릿수의 연산은 독립적이며 다른 자릿수에 영향을 주지 않는다. <ref name="논리연산자">〈[https://coding-factory.tistory.com/521 논리 연산자의 종류]〉, 《코딩 팩토리》</ref>
 
논리 연산자는 (&,│,^,~)로 이루어져 있으며 비트 논리 연산자는 그 대상이 boolean타입일 경우에는 일반 논리 연산자로 활용되지만 대상이 정수형일 경우에는 위의 표와 같이 비트 논리연산자로 활용한다. 비트 연산은 두 값을 비트 단위로 나열한 뒤 각 자릿수를 비트 연산자로 연산한다. 각 자릿수의 연산은 독립적이며 다른 자릿수에 영향을 주지 않는다. <ref name="논리연산자">〈[https://coding-factory.tistory.com/521 논리 연산자의 종류]〉, 《코딩 팩토리》</ref>
  
[[파일:And 연산자.PNG|400픽셀|섬네일|AND 연산자 예시]]
 
  
'''&(AND연산)'''
+
 
 +
==== AND 연산자 ====
 +
[[파일:And 연산자.PNG|350픽셀|섬네일|오른쪽|AND 연산자 예시]]
 +
 
 +
'''& (AND연산)'''
  
 
:{|class=wikitable width=300 style="background-color:#ffffee"
 
:{|class=wikitable width=300 style="background-color:#ffffee"
55번째 줄: 59번째 줄:
 
|}
 
|}
  
&연산(논리곱)은 2진수로 표현된 2개의 피연산자를 AND연산 하여 결과를 나타냅니다. <br> 2진수로 표현된 두 비트가 모두 1일 경우에만 연산결과가 1로 표현됩니다.
+
& 연산(논리곱)은 2진수로 표현된 2개의 피연산자를 AND연산 하여 결과를 나타낸다. <br> AND 연산자는 2진수로 표현된 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환한다.<ref name="논리연산자"></ref>
<ref name="논리연산자"></ref>
+
 
 +
 
 +
 
 +
 
  
 
==== OR 연산자 ====
 
==== OR 연산자 ====
[[파일:Or 연산자.PNG|400픽셀|섬네일|OR 연산자 예시]]
+
[[파일:Or 연산자.PNG|350픽셀|섬네일|오른쪽|OR 연산자 예시]]
'''│(OR연산)'''
+
 
 +
'''│ (OR연산)'''
 +
:{|class=wikitable width=300 style="background-color:#ffffee"
 +
|+
 +
!align=center colspan="2" style="background-color:#ffee88"|OR 연산 결과
 +
|-
 +
|align=center style="background-color:#ffeecc"|입력값
 +
|align=center style="background-color:#ffeecc"|반환값
 +
|-
 +
|align=center|0, 0
 +
|align=center|0
 +
|-
 +
|align=center|0, 1
 +
|align=center|1
 +
|-
 +
|align=center|1, 0
 +
|align=center|1
 +
|-
 +
|align=center|1, 1
 +
|align=center|1
 +
|-
 +
|}
 +
 
 +
| 연산(논리합)은 2진수로 표현된 2개의 피연산자를 OR연산 하여 결과를 나타낸다. <br> OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환한다. <ref name="논리연산자"></ref>
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
==== XOR 연산자 ====
 +
[[파일:XOR 연산자.PNG|350픽셀|섬네일|오른쪽|XOR 연산자 예시]]
  
=== 이동 연산자 ===
+
''' ^ (XOR연산)'''
 +
:{|class=wikitable width=300 style="background-color:#ffffee"
 +
|+
 +
!align=center colspan="2" style="background-color:#ffee88"|OR 연산 결과
 +
|-
 +
|align=center style="background-color:#ffeecc"|입력값
 +
|align=center style="background-color:#ffeecc"|반환값
 +
|-
 +
|align=center|0, 0
 +
|align=center|0
 +
|-
 +
|align=center|0, 1
 +
|align=center|1
 +
|-
 +
|align=center|1, 0
 +
|align=center|1
 +
|-
 +
|align=center|1, 1
 +
|align=center|0
 +
|-
 +
|}
 +
 
 +
^ 연산(배타적 논리합)은 2진수로 표현된 2개의 피연산자를 XOR연산 하여 결과를 나타낸다. <br>  XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환한다. <ref name="논리연산자"></ref>
 +
 
 +
 
 +
 
 +
 
 +
 
 +
==== NOT 연산자 ====
 +
[[파일:NOT 연산자.PNG|350픽셀|섬네일|오른쪽|NOT 연산자 예시]]
 +
 
 +
''' ~ (NOT연산)'''
 +
:{|class=wikitable width=300 style="background-color:#ffffee"
 +
|+
 +
!align=center colspan="2" style="background-color:#ffee88"|NOT 연산 결과
 +
|-
 +
|align=center style="background-color:#ffeecc"|입력값
 +
|align=center style="background-color:#ffeecc"|반환값
 +
|-
 +
|-
 +
|align=center|0
 +
|align=center|1
 +
|-
 +
|align=center|1
 +
|align=center|0
 +
|-
 +
|}
 +
 
 +
^연산(배타적 논리합)은 2진수로 표현된 2개의 피연산자를 XOR연산 하여 결과를 나타낸다. <br>  XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환한다. <ref name="논리연산자"></ref>
 +
 
 +
 
 +
 
 +
 
 +
 
 +
(예제)
 +
  System.out.println(" 15 & 25 = " + (15 % 25));
 +
  System.out.println(" 15 | 25 = " + (15 | 25));
 +
  System.out.println(" 15 ^ 25 = " + (15 ^ 25));
 +
  System.out.println(" ~25 = " + (~25)); <br>
 +
  15 & 25 = 9
 +
  15 | 25 = 31
 +
  15 ^ 25 = 22
 +
  ~25 = -26
 +
 
 +
 
 +
 
 +
=== 이동 연산자 ===  
 +
<ref name="비트연산자종류"></ref>
 
:{|class=wikitable width=1000 style="background-color:#ffffee"
 
:{|class=wikitable width=1000 style="background-color:#ffffee"
 
|+비트 연산자
 
|+비트 연산자
77번째 줄: 182번째 줄:
 
|-
 
|-
 
|align=center|>>>
 
|align=center|>>>
|align=center|(자바에만 존재)비트 값을 주어진 숫자 만큼 오른쪽으로 이동 시킨 후 빈공간을 모두 0으로 채운다(left shift 연산)
+
|align=center|(자바에만 존재)비트 값을 주어진 숫자 만큼 오른쪽으로 이동 시킨 후 빈공간을 모두 0으로 채운다
 
|}
 
|}
 +
 +
 +
==== Left Shift 연산자 ====
 +
''' << (left shift 연산)'''
 +
 +
<< 연산자는 두개의 피연산자를 요구하며 다음의 의미를 가진다.<br>
 +
num 비트를 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2배가 된다.<br>
 +
num 비트를 오른쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2로 나누어진다.<ref name="이동연산자">〈[http://donologue.tistory.com/55 이동 연산자의 종류]〉, 《구운밤》</ref>
 +
 +
  << 연산결과
 +
  int num1 = 3
 +
  num1 << 2; // num1 의 결과 값 3의 비트열을 2칸 왼쪽으로 이동한다. //
 +
  <br> num1 = 0000 0011
 +
  num1 = 0000 1100 // num1 의 결과 값이 3에서 12로 변한다.//
 +
 +
==== Right Shift 연산자 ====
 +
''' >> (right shift 연산)'''
 +
 +
>> 연산자는 두개의 피연산자를 요구하며 다음의 의미를 가진다.<br>
 +
num1 >> num2 : num1의 비트 열을 num2칸씩 오른쪽으로 이동시킨 결과를 반환한다.<br> <ref name="이동연산자"></ref>
 +
 +
  >> 연산결과
 +
  int num1 = 9
 +
  num1 >> 2; // num1 의 결과 값 9의 비트열을 2칸 오른쪽으로 이동한다. //
 +
  <br> num1 = 0000 1001
 +
  num1 = 0000 0010 // num1 의 결과 값이 9에서 2로 변한다.//
 +
 +
''' >>> (right shift 연산)'''
 +
 +
>>> 연산은 오직 자바에만 있는 연산이며 >> 연산과 기본원리는 같다. 연산자에서 중요하게 볼 부분은 음수의 이동이다. >> 연산자일때 양수의 이동일 경우 자동으로 0이 채워지지만 음수일 경우에는 0을 채우는 경우와 1을 채우는 경우로 나뉘어진다.<br> 하지만 >>> 연산자는 맨 왼쪽에서 최상위 부호비트와 관계없이 무조건 0으로 채워지기 때문에 결과값은 무조건 양수로만 나타나게 된다.<ref name="이동연산자"></ref>
 +
 +
  >>> 연산결과
 +
  int num1 = 9
 +
  num1 >>> 2; // num1 의 결과 값 9의 비트열을 2칸 오른쪽으로 이동한다. //
 +
  <br> num1 = 0000 1001
 +
  num1 = 0000 0010 // 양수일때는 >> 연산과 결과값이 같게 나온다.// <br>
 +
  int num1 = -9;
 +
  num1 = num1 >>> 2;
 +
  1073741821 // 음수일경우 이상한 값이 나온다. 그 이유는 빈자리를 0으로 채우기 때문이다.// <br>
 +
  int num1 = 0;
 +
  num1 = num1 >>> 2;
 +
  -3 // 따라서 음수일 때는 -부호를 붙여 사용하면 된다.
  
 
{{각주}}
 
{{각주}}
84번째 줄: 231번째 줄:
 
== 참고자료 ==
 
== 참고자료 ==
 
* 비트 연산자, 〈[http://tcpschool.com/c/c_operator_bitwise 비트 연산자]〉, 《TCP SCHOOL》
 
* 비트 연산자, 〈[http://tcpschool.com/c/c_operator_bitwise 비트 연산자]〉, 《TCP SCHOOL》
 +
* 비트 연산자의 종류,〈[https://rockykim5581.tistory.com/19 비트 연산자의 종류]〉, 《김로키》, 2015-11-22
 
* 논리 연산자, 〈[https://coding-factory.tistory.com/521 논리 연산자]〉, 《코딩팩토리》, 2020-04-19
 
* 논리 연산자, 〈[https://coding-factory.tistory.com/521 논리 연산자]〉, 《코딩팩토리》, 2020-04-19
 +
* 이동 연산자, 〈[https://donologue.tistory.com/55 이동 연산자]〉, 《구운밤》, 2016-07-10
  
 
== 같이 보기 ==
 
== 같이 보기 ==

2020년 8월 10일 (월) 16:05 기준 최신판

비트연산자(bitwise operator)는 비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자이다. 비트는 바이트 단위보다 더 작은 단위이며, 2진수를 저장한다. 즉 컴퓨터에서 사용할 수 있는 최소 단위이다. 또한 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.[1]

개요[편집]

비트 연산자는 데이터를 비트 단위로 연산한다. 그러므로 0과 1로 표현이 가능한 정수 타입만 비트 연산이 가능하다. 비트 연산자는 기능에 따라 비트 이동 연산자, 비트 논리 연산자로 구분된다. [1]

특징[편집]

논리 연산자[편집]

[2]

비트 연산자
종 류 연산자 설 명
논리 연산자 & 대응 되는 비트가 모두 1이면 1을 반환한다. (비트 AND 연산)
대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산)


논리 연산자는 (&,│,^,~)로 이루어져 있으며 비트 논리 연산자는 그 대상이 boolean타입일 경우에는 일반 논리 연산자로 활용되지만 대상이 정수형일 경우에는 위의 표와 같이 비트 논리연산자로 활용한다. 비트 연산은 두 값을 비트 단위로 나열한 뒤 각 자릿수를 비트 연산자로 연산한다. 각 자릿수의 연산은 독립적이며 다른 자릿수에 영향을 주지 않는다. [3]


AND 연산자[편집]

AND 연산자 예시

& (AND연산)

AND 연산 결과
입력값 반환값
0, 0 0
0, 1 0
1, 0 0
1, 1 1

& 연산(논리곱)은 2진수로 표현된 2개의 피연산자를 AND연산 하여 결과를 나타낸다.
AND 연산자는 2진수로 표현된 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환한다.[3]



OR 연산자[편집]

OR 연산자 예시

│ (OR연산)

OR 연산 결과
입력값 반환값
0, 0 0
0, 1 1
1, 0 1
1, 1 1

| 연산(논리합)은 2진수로 표현된 2개의 피연산자를 OR연산 하여 결과를 나타낸다.
OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환한다. [3]




XOR 연산자[편집]

XOR 연산자 예시

^ (XOR연산)

OR 연산 결과
입력값 반환값
0, 0 0
0, 1 1
1, 0 1
1, 1 0

^ 연산(배타적 논리합)은 2진수로 표현된 2개의 피연산자를 XOR연산 하여 결과를 나타낸다.
XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환한다. [3]



NOT 연산자[편집]

NOT 연산자 예시

~ (NOT연산)

NOT 연산 결과
입력값 반환값
0 1
1 0

^연산(배타적 논리합)은 2진수로 표현된 2개의 피연산자를 XOR연산 하여 결과를 나타낸다.
XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환한다. [3]



(예제)

 System.out.println(" 15 & 25 = " + (15 % 25));
 System.out.println(" 15 | 25 = " + (15 | 25));
 System.out.println(" 15 ^ 25 = " + (15 ^ 25));
 System.out.println(" ~25 = " + (~25)); 
15 & 25 = 9 15 | 25 = 31 15 ^ 25 = 22 ~25 = -26


이동 연산자[편집]

[2]

비트 연산자
종 류 연산자 설 명
이동 연산자 << 비트값을 주어진 숫자만큼 왼쪽으로 이동 시킨 후 빈자리는 0으로 채운다. (left shift 연산)
>> 비트값을 주어진 숫자만큼 오른쪽으로 이동 시킨 후 빈자리는 정수 a의 최상의 부호비트와 같은 값으로 채운다. (right shift 연산)
>>> (자바에만 존재)비트 값을 주어진 숫자 만큼 오른쪽으로 이동 시킨 후 빈공간을 모두 0으로 채운다


Left Shift 연산자[편집]

<< (left shift 연산)

<< 연산자는 두개의 피연산자를 요구하며 다음의 의미를 가진다.
num 비트를 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2배가 된다.
num 비트를 오른쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2로 나누어진다.[4]

 << 연산결과
 int num1 = 3
 num1 << 2; // num1 의 결과 값 3의 비트열을 2칸 왼쪽으로 이동한다. //
 
num1 = 0000 0011 num1 = 0000 1100 // num1 의 결과 값이 3에서 12로 변한다.//

Right Shift 연산자[편집]

>> (right shift 연산)

>> 연산자는 두개의 피연산자를 요구하며 다음의 의미를 가진다.
num1 >> num2 : num1의 비트 열을 num2칸씩 오른쪽으로 이동시킨 결과를 반환한다.
[4]

 >> 연산결과
 int num1 = 9
 num1 >> 2; // num1 의 결과 값 9의 비트열을 2칸 오른쪽으로 이동한다. //
 
num1 = 0000 1001 num1 = 0000 0010 // num1 의 결과 값이 9에서 2로 변한다.//

>>> (right shift 연산)

>>> 연산은 오직 자바에만 있는 연산이며 >> 연산과 기본원리는 같다. 연산자에서 중요하게 볼 부분은 음수의 이동이다. >> 연산자일때 양수의 이동일 경우 자동으로 0이 채워지지만 음수일 경우에는 0을 채우는 경우와 1을 채우는 경우로 나뉘어진다.
하지만 >>> 연산자는 맨 왼쪽에서 최상위 부호비트와 관계없이 무조건 0으로 채워지기 때문에 결과값은 무조건 양수로만 나타나게 된다.[4]

 >>> 연산결과
 int num1 = 9
 num1 >>> 2; // num1 의 결과 값 9의 비트열을 2칸 오른쪽으로 이동한다. //
 
num1 = 0000 1001 num1 = 0000 0010 // 양수일때는 >> 연산과 결과값이 같게 나온다.//
int num1 = -9; num1 = num1 >>> 2; 1073741821 // 음수일경우 이상한 값이 나온다. 그 이유는 빈자리를 0으로 채우기 때문이다.//
int num1 = 0; num1 = num1 >>> 2; -3 // 따라서 음수일 때는 -부호를 붙여 사용하면 된다.

각주[편집]

  1. 1.0 1.1 비트 연산자〉, 《TCP SCHOOL》
  2. 2.0 2.1 비트 연산자의 종류〉, 《김로키》
  3. 3.0 3.1 3.2 3.3 3.4 논리 연산자의 종류〉, 《코딩 팩토리》
  4. 4.0 4.1 4.2 이동 연산자의 종류〉, 《구운밤》

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 비트연산자 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.