두 피연산자의 and연산은 같은 자리의 비트끼리 전체 비트들에 대해서 수행하며 [표 1]에 AND연산을 정리하였다. 두 비트가 모두 1이어야 1이고 하나라도 0이라면 0이다.


[표 1] 비트-and 연산

x

y

x▪y

0

0

0

0

1

0

1

0

0

1

1

1


예를 들면 다음과 같다.


unsigned char ucx = 0x3A, ucy = 0xB2, ucz ;
ucz = ucx & ucy;


이 경우 변수 ucz에 저장되는 값은 다음과 같이 계산된다.





b7

b6

b5

b4

b3

b2

b1

b0



ucx

=

0

0

1

1

1

0

1

0

(0x3A)

&

ucy

=

1

0

1

1

0

0

1

0

(0xB2)


ucz

=

0

0

1

1

0

0

1

0

(0x32)


이 그림에서 보듯이 (unsigned) char형 변수는 보통 최하위 비트를 0번으로 해서 1번, 2번, ...  , 7번 비트까지 있으며 각각 b0, b1, b2, … , b7이라고 표시한다. 변수의 가장 하위 비트를 LSB (least significant bit), 가장 상위비트를 MSB (most significant bit)라고 한다. 이 경우는 8비트 연산이지만 16비트(short)나 32비트(long) 연산도 원리는 동일하다. 즉, 같은 위치의 비트끼리 and연산을 취하는 것이다.


 다음과 같은 경우에도 and연산이 사용된다. 만약 어떤 데이터 값에서 상위 4비트는 그대로 유지하고 하위 4비트만을 0으로 만들고 싶다면 어떻게 해야 할까.


unsigned char uca = 0xBA;
uca &= 0xF0;





b7

b6

b5

b4

b3

b2

b1

b0



uca

=

1

0

1

1

1

0

1

0

(0xBA)

&

0xF0

=

1

1

1

1

0

0

0

0

(0xF0)


uca

=

1

0

1

1

0

0

0

0

(0xB0)


위의 예에서 보면 0xF0(=0b11110000)과 and연산을 취하면 그러한 동작이 일어남을 알 수 있다. 그 결과로 uca변수에는 0xB0가 남는다. 즉 상위 4비트는 그대로 유지하면서 하위 4비트는 0으로 바뀐다. 이러한 연산을 마스킹(masking)이라고 한다.


C++ 강좌 전체 목록 >>>


c{c++},n{c0050}

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 bitwise-xor 연산 (^)  (0) 2015.05.20
C/C++의 bitwise-or 연산자 (|)  (0) 2015.05.20
C/C++의 비트 연산자의 종류  (0) 2015.05.20
C/C++의 대입연산자  (0) 2015.05.20
C/C++의 증감연산자(++, --)  (0) 2015.05.19
Posted by 살레시오
,

 비트 연산자는 피연산자의 같은 자리에 있는 비트끼리의 연산을 수행한다. 마이크로콘트롤러(아두이노 등) 프로그래밍에서는 특정 레지스터의 비트값을 조작해야 하는 일이 매우 빈번하기 때문에 비트 연산에 대해서는 자세히 알아두는 것이 좋다. 사실 PC와 같은 환경에서는 비트 연산이 그리 유용하지 않으나 마이크로콘트롤러 프로그래밍에서는 그렇지 않다는 것을 실제로 실습을 진행해 보면 알게 될 것이다.


 다음 표에 비트 연산자의 종류와 동작에 대해서 정리하였다.


표 3.6.1 비트연산자의 종류

비트연산자

의미

수행 동작

&

논리-and

두 피연산자의 bit-wise AND

|

논리-or

두 피연산자의 bit-wise OR

^

논리-xor

두 피연산자의 bit-wise XOR

~

논리 -not

피연산자의 bit-wise NOT

<<

왼쪽shift

비트의 위치를 왼쪽으로 이동

>>

오른쪽shift

비트의 위치를 오른쪽으로 이동


비트 연산자는 정수형 데이터(char, int, short, long, long long 과 각각의 unsigned형)에만 적용되며 실수형 (float, double, long double)에는 사용하지 않는다는 것에 주의해야 한다.


 이항 연산인 & (and), | (or), ^ (xor) 세 연산자의 경우 비트 연산은 데이터의 같은 위치에 있는 비트끼리 연산이 이루어진다는 사실을 숙지해야 한다. 또한 연산 기호가 논리 연산자(&&, ||, ~)와 비슷해서 혼동하기 쉬우니 주의해야 한다.


C++ 강좌 전체 목록 >>>


c{c++},n{c0049}

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 bitwise-or 연산자 (|)  (0) 2015.05.20
C/C++의 bitwise-and 연산  (0) 2015.05.20
C/C++의 대입연산자  (0) 2015.05.20
C/C++의 증감연산자(++, --)  (0) 2015.05.19
C/C++의 조건 연산자(?:)  (0) 2015.05.19
Posted by 살레시오
,

3.8 대입연산자    [doc]    [smts]

대입 연산자 “=”는 두 개의 피연산자를 갖는 이항 연산자이다. 연산식에서 우변에서 구해진 값을 좌변의 변수에 저장하는 역할을 한다. 대입연산자는 아래 [표 1]에 보인 바와 같이 여러 가지 종류가 있다. 단순 대입연산자 ‘=’와 관계연산자 ‘==’는 확실히 구분해야 함은 다시 한 번 강조한다.


[표 3.8.1] 대입연산자의 종류

대입연산자

수행 동작

=

좌측값을 우측변수로 대입

+=, -=

좌값과 우값을 더한(뺀) 후 좌측에 저장

*=, /=

좌값과 우값을 곱한(나눈) 후 좌측에 저장

%=

좌값을 우값으로 나눈 나머지를 좌측에 저장

&=, |=, ^=

좌값과 우값을 AND/OR/XOR 한 후 좌측에 저장

<<=, >>=

좌값을 우값으로 왼쪽/오른쪽 비트이동한 후 좌측에 저장


 위 표에서 보듯이 대입연산자들 중 “연산자=” 의 형태를 갖는 것들이 있다. 예를 들어서 다음 두 줄은 같은 일을 수행한다.


a += b;

a = a + b;


이 두 표현식은 완전히 동일하며 보통 줄여서 전자와 같이 사용한다. 또 다른 예로


a += b + 10;
a = a + (b+10);

이 두 줄도 완전히 동일하다. 우변이 먼저 구해진 후 그 값을 이용하여 좌변의 변수를 갱신시키는 것이다. 대입 연산자의 우선 운위가 가장 낮다.


몇몇 예를 다음 표에 더 들었다.


[표 3.8.2] 대입 연산자의 용례들

용례

동일식

동작

x -= 20;
x = x-20;

x에서 20을 뺀다.

x *= 5;
x = x*5;

x에 5를 곱한다.

x %=10
x = x%10

x에 x를 10으로 나눈 나머지를 저장한다.

x += y-5
x=x+(y-5)

x에 (y-5)를 더한다.


다음 예를 입력하고 결과를 확인하여 보자.


ex03-11.c
#include "stdio.h"
int main(void) {
 int ia=1, ib=10;
 ia++;
 ib -= ia;
 ia *= ib++;
 ia %= --ib;
 printf(“ia:%d, ib:%d”, ia, ib);
}

ia:?? , ib:??

단순 대입연산자 =는 한 표현식에서 중복으로 사용할 수 있다. 예를 들면


a = 0;
b = 0;
c = 0;

이 세 줄은 다음과 같이 한 줄로 줄일 수 있다.


a = b = c = 0;


이 때 연산은 오른쪽에서 왼쪽으로 순차적으로 일어난다. 따라서 먼저 c=0을 수행하고 그 결과 값을 다시 b에 대입하고 마지막으로 a에 대입한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 bitwise-and 연산  (0) 2015.05.20
C/C++의 비트 연산자의 종류  (0) 2015.05.20
C/C++의 증감연산자(++, --)  (0) 2015.05.19
C/C++의 조건 연산자(?:)  (0) 2015.05.19
C/C++의 논리 연산자  (0) 2015.05.19
Posted by 살레시오
,