연산자(4)
※ 비트 연산자 ※
-
-
비트 연산을 이해하기 위해서는 위의 비트 연산자 종류에 대한 이해와 함께
다음 표에 나타나 있는 비트 연산 진리표를 알아야 한다.
-
-
AND(&), OR(|), XOR(^), 시프트(<<, >>) 연산은
피연산자(연산에 사용되는 데이터)가 2개인 이항 연산자이지만
NOT(~) 연산자는 피연산자가 1개인 단항 연산자이다.
아래의 예제를 봐보자.
-
-
11행의 구문을 봐보자
-
-
먼저 변수 a와 b의 값을 OR(|) 연산자를 이용해서 OR 연산을 수행하는 11행의 내용은
다음 사진과 같이 비트 배열로 나타내 보면 결과를 명확히 알 수 있다.
-
-
12행은 & 연산자를 사용해서 a와 b의 값을 &(AND) 연산을 한 뒤에 그 결과를 출력하는 것으로
다음 사진과 같이 비트 배열로 나타내어 결과를 확인하면 각각의 자리마다 1로 모두 일치하는 비트가 없어
그 결괏값이0이라는 사실을 알 수 있다.
-
-
13행은 ^(XOR) 연산을 수행하는 연산으로 각 비트의 표현이 서로 다를 경우만 1이 된다.
따라서 다음 사진을 보면 비트가 서로 다를 경우만 결과가 1이기 때문에 최종 결과는 3이 되는 사실을 확인할 수 있다.
-
-
14행은 다음 사진과 같이 변수 a의 보수(1의 보수)를 취하는 것으로
1인 비트는 0으로, 0인 비트는 1로 바꾸는 연산을 취한다.
-
-
맨 위의 예제의 결과 내용과 같이 시프트 연산 중
비트 배열을 왼쪽으로 이동시키는 연산(<<, 좌측 시프트 연산)의 경우
signed와 unsigned의 자료형과는 관계없이 n개의 비트를 이동했을 때 오른쪽에서 n개의 비트만큼 0으로 채워지기
때문에 연산을 취하기 이전의 값에 2의 n승을 곱하는 경우와 같은 효과가 있다.
즉, <<(좌측 시프트 연산)은 제곱으로 증가된다.
참고로 시프트 연산은 곱셈 연산보다 속도가 빠른 것으로 알려졌기 때문에
나중에 곱셈 연산을 대체할 수 있을 때는 시프트 연산을 사용하는 것이 좋다.
-
그리고 오른쪽으로 비트 배열을 이동시키는 연산(>>, 우측 시프트 연산)의 경우
자료형의 unsigned 또는 signed 형태에 따라 그 결괏값이 달라진다는 것을 알 수 있다.
signed 형태의 자료형이면 가장 왼쪽의 비트(최상위 비트)가 1일 경우
우측으로 비트 이동 시 최상위 비트가 1로 채워지고
최상위 비트가 0일 경우 우측으로 비트 이동 시 최상위 비트가 0으로 채워지게 된다.
unsigned 형태의 자료형에서 좌우 비트 이동할 때 모두 0으로 채워지는 것과는 대조적이다.
-
이 점을 주의해야 하며, 우측으로 비트 이동을 하는 시프트 연산을 사용하는 경우 자료형의 종류와
최상위 비트(부호 비트)가 어떤 값인지 확인하고 사용해야 한다.
지금까지 다양한 연산자의 종류에 대해서 배워보았다.
각 연산자는 각각 따로 사용될 수 있을 뿐만 아니라 서로 다른 연산자와 함께 사용될 수도 있다.
서로 다른 연산자가 섞여 있을 때의 우선순위는 각 연산자의 우선순위에 따라 연산 순서가 결정된다.
연산자의 우선순위는 아래의 사진과 같다.
-
-
연산자 우선순위를 모두 암기할 필요까지는 없다.
필요에 따라 표의 내용을 참고하여 사용하면 될 것이다.
만약 서로 다른 연산자가 함께 사용되어야 하는 상황에서 연산자의 우선순위가 정확하게 기억나지 않으면
안전하게 우선순위가 가장 높아지게 해주는 역할을 하는
'(' 기호와 ')' 기호를 쓰는 괄호 연산자로 묶어서 사용할 수 있다.
사실 이 방법이 소스코드의 가독성을 더욱 높여 주기 때문에 연산자의 우선순위가 애매한 경우
연산자 우선순위를 확인하여 사용하는 방법보다 괄호 연산자를 사용하는 방법을 추천한다.