비트단위 연산자는 정수형 데이타를 비트로 접근한다.
각 비트의 1은 True, 0은 False.

[비트단위 논리연산자]
~ NOT 비트단위 논리부정
: True 는 False 로, False 는 True 로 ...

예. ~ 0101 0010   =  1010 1101


& AND 비트단위 논리곱 : 둘다 True 일때만 True , 그렇지않으면 False
| OR 비트단위 논리합 : 둘다 False 일때만 False, 그렇지않으면 True
^ XOR 비트단위 배타적논리합(eXclusive OR) : 둘이 다르면 True, 같으면 False

사용자 삽입 이미지

예. 0101 0010 & 0100 0111 =  0100 0010
     0101 0010 | 0100 0111 =  0101 0111
     0101 0010 ^ 0100 0111 =  0001 0101

위의 연산자들을 잘 조합하면, NOR나 NAND 도 쉽게 만들 수 있다.


[비트단위 이동연산자]
<< 왼쪽으로 원하는 bit 수 반큼민다.
밀려서 잘려나가는 부분은 버린다. 밀려서 생기는 공백은 0 으로 채운다.

>> 오른쪽으로 원하는 bit 수 반큼민다.
밀려서 잘려나가는 부분은 버린다. 밀려서 생기는 공백은 0 또는 1로 채우는데, 이것은 시스템 의존적이다.
unsigned 인 경우에는 << 와 마찬가지로 0 으로 채운다.
반면, signed 인 경우에는 일반적으로 부호비트를 복사해넣는다. 부호비트는 최상위비트로 음수일때 1, 양수일때 0 이다.

<< 와 >> 는 변수값 자체를 변화시키지 않는다.
값을 변화시키려면, <<= 나 >>= 따위를 써서 재배정 해주면 된다.

첨부된 프로그램은 << 와 >> 가 어떻게 작용하는지 보여준다.

사용자 삽입 이미지

첫번째 데이타는 오른쪽으로 밀었을때 모두 잘려나간 데이터가 버려져서, 왼쪽으로 돌아왔을때 사라진 모습을 보여준다.

두번재 데이타는 왼쪽으로 밀려갔다가, 하필 최상위비트가 1이 되는 바람에 오른쪽으로 돌아올때 부호비트로 공백이 채워진 모습을 보여준다.

사용자 삽입 이미지


첨부파일 ( 입력정수는 int 형임. 오류처리안되어있음 )


마스크(mask)

마스크는 원하는 비트를 추출하기위한 상수이다. 즉 원래의 바이너리 시퀀스 이외에 어떤 구멍이 뽕뽕 뚤린 비교대조용 시퀀스를 만들어서 그것을 마치 오리지날 위에다가 마스크처럼 씨우는거다. ( 덮어쓴다는 말은 아니다. )

하위로 부터 n번째 비트만 1인 마스크는 1<<(n-1) 로 하면 된다.

마스크를 이용하면 트정 비트의 값도 반대로 바꿀수 있고, 비트단위의 출력도 간단하게 할 수 있다. 위 첨부프로그램도 마스크를 루프안에 넣어서 마스크가 움직이면서 각 비트를 찍는 방법으로 인쇄한것이다.

특히, 마스크를 이용해서 인쇄할때, 삼항연산자를 쓰면 편하다.

예.   ( a & ( 1<<(n-1))) ? 1 : 0
       ( a & ( 1<<(n-1))) ? '1' : '0'