Creative Commons License

Software Dev

프로그래밍기본
객체지향
프로젝트관리
알고리즘
데이타베이스

소프트웨어 개발에 필수적이고 필요한 주제에 대한 강의 및 공유

.

프로그래밍기본

닷넷 기반 개발도 결국 소프트웨어 개발입니다. 소프트웨어 개발을 위한 기본기를 다룹니다

비트 단위 연산

작성자 : 박종명
최초 작성일 : 2008-05-07 (수요일)
최종 수정일 : 2008-05-07 (수요일)
조회 수 : 4235

정보의 최소 단위는 비트입니다.
보통 프로그램을 작성할때 int,long 등 바이트 단위롤 연산하도록 프로그램을 작성합니다.
 
그러나 비트 단위로 연산을 하게 되면 메모리 공간을 줄이고 성능을 향상 시킬 수 있습니다.
주로 하드웨어 프로그래밍에서 자주 사용되는 연산이라 할 수 있습니다.
그러나 의지만 있으면 우리가 작성하는 일반적인(?) 프로그램도 비트 단위 연산을 하면 성능에 아주 좋은 영향을
줍니다. 지금부터 비트 단위로 연산을 하는 방법을 알아 봅니다.
 
비트 단위 연산에는 아래와 같은 연산자가 있습니다.
&   : 비트 단위 AND
|    : 비트 단위 OR
^   : 비트 단위 XOR
~   : 비트 단위 NOT
<< : 왼쪽으로 이동
>> : 오른쪽으로 이동
 
주의 할 점은 비트 단위 연선에서의 피 연산자, 즉 연산의 대상은 반드시 정수이어야 합니다.
실수의 비트 연산은 불가능 합니다.
 
1. & (비트 단위 AND) 연산자
두 비트의 값이 모두 1일때 1을 반환합니다.
 0 & 0 = 0
 0 & 1 = 0
 1 & 0 = 0
 1 & 1 = 1
 
 ex> 15 & 20 연산은 아래와 같이 수행 됩니다.
        00001111
    &  00010100
    -----------------
        00000100 = 4 가 됩니다.
 
2. | (비트 단위 OR) 연산자
두 비트 중 하나만 1이면 1을 반환합니다.
 0 | 0 = 0
 0 | 1 = 1
 1 | 0 = 1
 1 | 1 = 1  
 
ex> 15 | 20 연산은 아래와 같이 수행 됩니다.
        00001111
    |   00010100
    -----------------
        00011111 = 31 가 됩니다.
 
3. ^ (비트 단위 XOR) 연산자
두 비트가 서로 다를 경우 1을 반환 합니다.ㅏ
 0 ^ 0 = 0
 0 ^ 1 = 1
 1 ^ 0 = 1
 1 ^ 1 = 0
 
ex> 15 ^ 20 연산은 아래와 같이 수행 됩니다.
        00001111
    ^ 00010100
    -----------------
        00011011 = 27가 됩니다.
 
4. ~ (비트 단위 NOT) 연산자
비트를 반전 시킵니다(비트 값의 보수)
 ~ 0 = 1
 ~ 1 = 0
 
ex > ~15 연산은 아래와 같이 수행 됩니다.
      NOT  00000000 00000000 00000000 00001111
-------------------------------------------------------------------
               11111111 11111111 11111111 11110000 가 됩니다.
               부호 비트 까지 반전이 되었으므로 음의 정수 값이 됩니다. (15의 1의 보수가 됩니다)
               그리고 1을 더하면(결국 15의 2의 보수) -15가 됩니다 
 
5. << 왼쪽 쉬프트 (비트 단위 이동) 연산자
    a << b => a의 비트들을 b만큼 왼쪽으로 이동합니다.
 
ex> 15 << 2 연산은 아래와 같이 수행 됩니다.
       00000000 00000000 00000000 00001111 을 왼쪽으로 2칸씩 이동 시킵니다.
   00000000 00000000 00000000 00001111      데이터 범위를 넘어서 이동한 비트들은 버려집니다(빨간색 부분)
       00000000 00000000 00000000 00111100  이동한 만큼 비어 있는 오른쪽 비트는 0으로 채우게 됩니다(빨간색 부분)
       따라서 결과는 60 이 됩니다.
 
   주의 할 점은 맨 앞의 부호 비트 까지 이동하므로 데이터의 부호가 바뀔수 있습니다(양/음이 바뀐다)
 
6. >> 오른쪽 쉬프트 (비트 단위 이동) 연산자
    a << b => a의 비트들을 b만큼 오른쪽으로 이동합니다.
 
ex>
위의 식에서 a가 양수이면(부호 비트 0) 위의 왼쪽 쉬프트 연산과 완전 동일합니다. 오른쪽으로 넘어간 비트들은 여전히 버려질 것이며 이동한 만큼 비어 있는 왼쪽 비트는 0으로 채우게 될 것입니다. 
그러나 a가 음수라면 예기는 좀 달라 집니다.
      
       -10 >> 2 연산은 아래와 같이 수행 됩니다. (2바이트로 표현한다고 가정 합니다)
       11111111 11110110 (-10의 2진수 표현) 을 오른쪽으로 2칸씩 이동 시킵니다
           11111111 11110110  데이터 범위를 넘어서 이동한 비트들은 버려집니다(빨간색 부분)
       ??111111 11111101      이동한 만큼 비어 있는 왼쪽 비트는 0 또는 1로 채워 집니다.
 
       시스템에 따라 ?? 부분이 0으로 채워질 수도 1로 채워질 수도 있습니다.
       음수를 유지하기 위해 1로 채우기도 하고, 양수의 비트 연산처럼 0으로 채우기도 합니다.
       해당하는 시스템을 확인 할 필요가 있습니다. 

 
Tip>>
1. << (왼쪽 쉬프트) 연산을 사용하면 주어진 값의 배수를 쉽게(빠르게) 구할 수 있다.
    << 연산자를 이용하여 1칸씩 왼쪽으로 이동하면 계속해서 값의 2배가 된다.
    ex> 15 << 1 = 30 , 15 << 2 = 60 .....
 
   같은 의미로 >> (오른쪽 쉬프트) 연산을 사용하면 주어진 값을 2로 나눈 결과가 나온다.
   >> 연산자를 이용하여 1칸씩 오른쪽으로이동하면 계속해서 값을 2로 나눈 결과가 나온다
   단, 나눈 결과가 실수 이면 소수점 부분은 제외(절사) 된다.
   ex> 30 >> 1 = 15 , 30 >> 2 = 7 , 30 >> 3 = 3 
 
2. 정수값의 부호를 바꾸고 싶으면 2의 보수를 사용하면 된다.
    즉, 이 말은 정수값의 ~(NOT) : 1의 보수 값을 구해서 1을 더하면 2의 보수가 되는 원리를 이용하면 된다.
    ex> (~-100) + 1 = 100 
        

∵Commented by 외계인 at 2010-08-23 오후 3:39:51  
정말 초보적인 질문 하나 드립니다...^^;;
위에서
ex > ~15 연산은 아래와 같이 수행 됩니다.
NOT 00000000 00000000 00000000 00001111
-------------------------------------------------------------------
11111111 11111111 11111111 11110000 가 됩니다.
부호 비트 까지 반전이 되었으므로 음의 정수 값이 됩니다.
2의 보수를 취해 양의 정수를 계산해 보면 -16이 됩니다.
라는 부분이 있는데 음의 정수값이 된다는 세번째 줄까지는 이해가 되는데 네번째 줄에서 2의 보수를 취하면 맨 앞이 0이 되므로 -16이 아니라 +16이 되는 것 아닌가요...
제가 지금 2의 보수의 개념이 참 헷갈리는 부분이 있어서 이것이 이해가 안되는 것인지 모르겠는데 예를 들어 질문하고자 합니다:
1바이트로 숫자 15를 표현하면 1111인데 그럼 이것은 맨 앞이 1이니 컴은 이것을 -7로 인식하나요?
그럼 15를 어떻게 표현해야 하는지요? 컴은 이것을 어떻게 구분하나요? 아님 1바이트로 양수 음수를 표현하려면 7까지밖에 표현하지 못한다고 정해지는건가요?
독학의 길은 멀고도 험난하네요...ㅋ
∵Commented by 박종명 at 2010-08-23 오후 5:24:30  
헐; 이런...
일단 -16이 아니라, -15가 됩니다 ^^

그리고 님 질문을 보니, 제 글이 오해를 불러 일으킬만하게 전개되었네요..
전 15에 대한 2의 보수가 -15가 된다는 의미를 적고 싶었는데,
1의 보수를 취하고 2의 보수라고 말했으니, 당연히 혼란스럽네요 ^^
일단 수정할께요


∵Commented by 박종명 at 2010-08-23 오후 5:31:24  
그리고 추가 질문데 대한 답변입니다

1바이트 = 8비트로 숫자 15를 표현하면 00001111 입니다
따라서 맨앞은 0 입니다(0은 양수)

00001111 의 2의 보수가 -15 입니다

아래 글을 참고해 보셨나요? 글 참고 바랍니다
http://mkexdev.net/Article/Content.aspx?parentCategoryID=2&categoryID=9&ID=96
∵Commented by 외계인 at 2010-08-23 오후 6:36:06  
네~링크를 주신 글은 이미 읽어본 것입니다만..제가 알고 싶은 것은 그럼 이렇게 질문할께요~
1바이트=8비트로 숫자 255는 11111111로 표현되잖아요...그럼 이건 맨 앞이 1이니 음수여야 하는데 숫자 255는 양수잖아요...즉 8비트로는 숫자 255를 표현하지 못한다는 규정이 있는 것인가요? 즉 맨 앞 한비트는 부호비트이니 여기서는 7비트 127까지밖에 표현 못하는 것인가요?
∵Commented by 박종명 at 2010-08-23 오후 6:48:04  
네. 님 말이 맞습니다.그런 규칙이 있지요.
여러개의 비트중 상위 1비트를 부호비트로 사용할지 말지에 대한 규칙입니다
예를 들어 닷넷에 byte 와 sbyte가 있습니다
byte는 부호없는 8비트라서 0 ~ 255까지 표현가능합니다
sbyte는 부호있는 8비트라서 -128 ~ 127 까지 표현가능합니다

다른 정수자료형도 부호비트 사용여부에 따라 표현범위가 달라집니다
아래 글 참고하세요
http://mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=518
∵Commented by 외계인 at 2010-08-23 오후 6:59:00  
아항~ 아직 밑에서부터 보다보니 링크주신 문장까지 보지 못했네요~ ㅎ
이렇게 실시간으로 답변을 해주셔서 정말 감사합니다!!!
글을 하나 보고 나오는 개념들을 다 이해하고 넘어가고자 하다보니 속도가 많이 느리네요..ㅋ
언제나 친절한 답변 정말 감사합니다!!!
실례지만 박종명님 나이가 궁금해지네요...ㅋㅋ
∵Commented by 박종명 at 2010-08-24 오전 11:00:13  
IT 개발자 치고는 연식이 좀 있는 편입니다 ^^;
∵Commented by 외계인 at 2010-08-24 오후 2:16:02  
님의 연식(^^)을 알았습니다! 구홈피에 있는 정보가 정확하다면 말이죠... 저보다 한살 많으십니다...ㅋㅋ
∵Commented by 박종명 at 2010-08-24 오후 3:16:25  
님도 1년에 한번은 정기점검을 받으셔야 하는 연식이 되셨군요 ^^;
이름
비밀번호
홈페이지
RR <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요