본문 바로가기

Programming/C++

비트 연산자

0.  비트 연산

n  비트 연산은 객체 상태를 추적하기 위해서 플래그를 설정할 때 유용하게 사용된다.

n  모든 비트는 8비트를 가지고 있고 따라서 4바이트의 길이는 32비트의 독립된 플래그를 가질 수 있다 비트는 그 값이 1이면 설정되었다라고 하고 0이 되면 설정되지 않았다 할 수도 있다.

n  C++에서 각각의 비트에 작용하는 비트 연산자를 제공을 한다. 이는 논리 연산자와 비슷해 보이지만 다르다. 비트 연산자는 아래 표와 같다.

기호

연산자

&

|

^

~

AND

OR

배타적인 OR

보수(Complement)

 

n  비트 연산자 AND

AND(&) 연산자는 논리 연산자(&&)와 달리 ‘&’가 한 개가 쓰인다. 두 개의 비트를 AND를 하면, 만일 두 개의 비트가 다 1이면 1이고 나머지는 0이된다.

n  비트 연산자 OR

OR(|) 연산자는 두 개의 값 중 하나라도 설정(1이라는 말)이 되어 있으면 1이 된다.

n  배타적 비트 연산자 E-OR

배타적 연산자는 두 개의 비트가 다를 때 1이 된다.

n  보수 연산자(Complement)

보수 연산자는 설정되어 있는 모든 비트는 지우고 지워져 있는 모든 비트는 설정이 된다. 예를 들면 “10010011” 의 보수 결과는 “01101100”가 된다.

n  비트 설정

특정 비트를 설정하거나 지우고 싶을 때 masking 연산자를 사용을 한다. 4바이트 플래그를 가지고 있고 8번 비트를 true로 설정하고 싶을 때는 128의 값을 OR를 하면 된다. 그 이유는 128은 이진으로 1000 0000이기 때문이다. 현재 비트 값이 무엇이든 128 OR를 하면 이 8번째를 설정하고 다른 곳에는 전혀 영향을 안 미친다.

예를 들면 아래의 표와 같다.

1010 0110 0010 0110  /// 8번 비트가 0이다 1로 변경을 하려면

| 0000 0000 1000 0000

----------------------

  1010 0110 1010 0110

첫째 비트는 오른쪽에서 왼쪽으로 왼쪽으로 세어진다 (나도 처음에 헷갈려서 신나게 작업했는데 ㅋㅋㅋㅋ)

 

n  비트 초기화

8번째 비트를 지우려면 128의 보수로 and를 하면 된다. 128의 보수는 8번째 비트를 지우고 나머지 모든 부분을 설정을 하면 된다. 그럼 확인을 해본다

1010 0110 1010 0110의 값의 8번째 비트를 지우면 다음과 같이 하면 된다.

128의 보수는 128 1000 0000 이므로 보수는 0111 1111이 된다 그럼 and 연산을 하면 되므로 다음과 같다.

1010 0110 0010 0110

                &1111 1111 0111 1111

                1010 0110 0010 0110 /// 이와 같이 변경을 할 수 있다.

è  비트 바꾸기

8번째 비트를 바꾸는 방법은 배타적인 OR를 하면 된다.

 1010 0110 1010 0110   /// 숫자

^0000 0000 1000 0000   /// 128

--------------------

 1010 0110 0010 0110   /// 8번째 변경

^0000 0000 1000 0000   /// 128

--------------------

 1010 0110 1010 0110   /// 다시 원위치 됨

 

è  비트 필드

모든 바이트가 다 사용되거나 혹은 6개나 8개의 바이트를 저장해서 사용하야 연산이 되는 경우가 많다. 만약에 사용자가 작성한 클래스나 구조체가 일련의 나열형 변수를 사용하거나 혹은 변수들이 매우 작은 값을 가진다면 이들에게 비트 필드를 사용하게 할 수 있다.

 비트 필드는 클래스 멤버와 같이 이름지어지고 접근 할 수 있다. 그 혈들은 항상 unsigned 정수형으로 선언이 된다 비트 필드 이름 다음에 콜론을 쓰고 숫자를 쓴다.숫자는 컴파일러에서 얼마나 많은 비트가 이 변수에 할당될 것인지를 알려주는 명령어이다.예를 들어 1이라고 쓰면 0 1, 2라고 쓰면 0, 1, 2, 3 이고 3 8개의 값을 의미한다. 아래의 사용 예를 보자

'Programming > C++' 카테고리의 다른 글

try – catch, throw  (0) 2010.01.05
Effective C++ 정리글(펌)  (0) 2009.11.21
namespace Declaration  (0) 2009.11.20
friend 함수  (0) 2009.11.20
Class 에서 함수 정의에 사용되는 static  (0) 2009.11.19