본문 바로가기

자동제어/PC 제어

PC제어프로그램 7일차 (20.05.28) - 기본코딩

반응형

단축연산

비트 연산자 &와 | 는 논리연산자로 이용할 수 있다.

&&와 || 은 단축 연산을 수행한다.

단축 연산은 먼저 수행하는 피연산자의 결과가 결정되면 뒤에 오는 피연산자는 평가하지 않는다.

 

 

 

 

일반연산 프로그램

 

 

 

단축연산 프로그램

 

 

 


조건 연산자

조건연산자는 C언어 중 유일한 3개의 피연산자를 갖는 삼항 연산자.

 

exp1  ?  exp2 exp3

연산식 exp1이 0이 아닌 값(참)으로 평가되면,

삼항 연산자의 평가값은 두 번째 연산식인 exp2의 값으로 평가된다.

연산식 exp1이 0(거짓)으로 평가되면,

삼항 연산자의 평가값은 세 번째 연산식인 exp3의 값으로 평가된다.

 

변수 x의 절대값을 변수 absolute에 저장

  absolute = (x<0) ? -x : x;

 

  absolute = (x<0) ? -x : x;

큰 수와 작은 수

 

 

 

위의 방법은 2가지로 할 수 있다.

1. 지시자 형태로 아래와 같이 표현한다.

    #define MAX(x,y) ((x<y) ? y : x)

2. 프로그램 속에서 한 줄로 표현하는 방법이 있다.

    printf("두 수 (%d, %d) 중에서 작은 수는 %d이다.\n", a, b, a < b ? a : b);

 


 

 

one비트의 개념

one byte(8bit)가 출력이 될때 (8비트개념)

 

마이크로  <-----> 장치

프로세서  

 

 

8비트라는게 8비트가 1비트씩 가냐? 한꺼번에 모두 가냐?

8개의 신호가 한 번에 간다.

 

필요한 데이터만 원하고 나머지 데이터는 필요없다.

이것이 비트논리이다.

 

비트 논리 연산자

피연산자 정수 값(32비트)을 비트 단위로 논리 연산을 수행하는 연산자.

2진수 각 자리에 대해 연산

결과가 음수일 경우,  2의 보수로 바꾸고 10진수화 (XOR)

 

전체를 32비트(4byte)로 본다.

연산자 기호
AND x & y
OR x | y
XOR x ^ y
NOT ~ x

(3 & 5) == 1 (참과 참이므로 1이다 이렇게 생각할 수 있다.)

(7 & 5) == 5 (이 경우는 비트 논리로 볼 때 참이다)

 

 

3(10) ->    0011(2)

5(10) ->&) 0101(2)

1(10) ->    0001(2)

 

7(10) ->    0111(2)

5(10) ->&) 0101(2)

5(10) ->    0101(2)

 

1비트에 대한 개념이다.

장비에서 스위치 값을 쓰거나

led를 점등시키려 할때 

한 선로의 개념을 가져가야 한다.

 

 

 

 

 

 

3(10) ->   0011(2)

5(10) -> |) 0101(2)

7(10) ->    0111(2)

 

3(10) ->   0011(2)

5(10) ->^) 0101(2)

6(10) ->    0110(2)

 

여기서 문제는 ~3과 ~5이다.

~3(10) -> ~(0011(2))를 32비트로 표현하면

32비트 : 00000000 00000000 00000000 00000011(2) (십진수 3)

여기서 not이므로

32비트 : 11111111 11111111 11111111 11111100(2) (십진수 -3)

 

첫 비트가 0이면 양수

첫 비트가 1이면 음수

 

음수를 표현할 방법은 2의 보수를 이용한다.

1의보수를 구한다.

32비트 : 00000000 00000000 00000000 00000011 (십진수 -3)

                                                             +1 (2의보수)

32비트 : 00000000 00000000 00000000 00000100 (십진수 4)

부호가 - 이므로 -4로 한다.

 

 

 

  5(10)  -> 00000000 00000000 00000000 00000101

~5(10)  -> 11111111 11111111 11111111 11111010

1의보수 -> 00000000 00000000 00000000 00000101

2의보수 -> 00000000 00000000 00000000 00000110

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

결과 값은 -6

 

 

~3는 -4

~5는 -6

미루어 생각하면 

~2는 -3

~7는 -8

 


이동 연산자

비트 단위로 왼쪽이나 오른쪽으로 이동시키는 연산자

이동 후 좌우측 경계를 벗어난 비트는 무시하고, 오른쪽의 빈 비트는 0을 채우고, 왼쪽은 부호비트를 채운다.

 

연산자 기호 의미
왼쪽 이동 연산자 << shift left
오른쪽 이동 연산자 >> shift right

 

 

00~00  7(10) -> 0000 0111

00~00 14(10) -> 0000 1110

00~00 28(10) -> 0001 1100

 

 

 

 

c언어를 오른쪽으로 이동하면

8 -> 4 -> 2로 반씩 줄어든다.

7 -> 3(3.5) -> 1(1.5)로 반씩 줄어든다.

 

000  7(10) -> 0000 0111

000  3(10) -> 0000 0011

000  1(10) -> 0000 0001

 

000  8(10) -> 0000 1000

000  4(10) -> 0000 0100

000  2(10) -> 0000 0010

 

어셀블이어를 오른쪽으로 이동하면

1100 1001

-> 1100 100  1(떨어진 1이 왼쪽으로 붙는다.)

-> 1110 0100

 

어셀블이어를 왼쪽으로 이동하면

1100 1001

-> 100 10011

 

 

-7 >> 2 (-7을 두자리 이동시키면)

  ?(10)   -> 11111111 11111111 11111111 1111 _ _ _ _ 

1의보수 -> 00000000 00000000 00000000 0000 0110

2의보수 -> 00000000 00000000 00000000 0000 0111 (-7)

 

원래의 수(10)   -> 11111111 11111111 11111111 1111 1001 

1번이동 => 1 11111111 11111111 11111111 1111 100 (1은 부호비트)

1번이동 -> 11 11111111 11111111 11111111 1111 10 (1은 부호비트)

 

위의 숫자는 음수이므로 2의 보수로 바꾸면

두자리 이동한 수가 된다.

 

1의 보수  00000000 00000000 00000000 00000001 

2의 보수  +                                                 1

이동한 값 00000000 00000000 00000000 00000010  (-2)

 


[ 문제 ]

-9 >> 3

-9는 어떤 수인가 뭔가 찾은게 -9라는 것이다.

원래의 수는 ? 

원수(10)-> 11111111 11111111 11111111 1111 _ _ _ _ 

1의보수 -> 00000000 00000000 00000000 0000 1000

2의보수 -> 00000000 00000000 00000000 0000 1001 (-9)

 

           ->  11111111 11111111 11111111 1111 0111

1번이동 -> 1 11111111 11111111 11111111 1111 011 (1은 부호비트)

1번이동 -> 11 11111111 11111111 11111111 1111 01 (1은 부호비트)

1번이동 -> 111 11111111 11111111 11111111 1111 0 (1은 부호비트)

 

위의 수는 음수이므로 2의 보수로 바꾸면 3자리 이동한 수가 나온다.

1의 보수    00000000 00000000 00000000 00000001 

2의 보수  +                                                    1

이동한  값  00000000 00000000 00000000 00000010 (-2)

 

 

 

9 << 3

9(10)  ->  00000000 00000000 00000000 00001001

?(10)  ->  00000000 00000000 00000000 01001000

이동한 값은 = 64 + 8 = 72

 

 

비트 이동 연산자(<< , >>)의 결과

참고 : https://soyoja.com/263

참고 : http://prof.dongju.ac.kr/syhong/public_html/teaching/c/c04.htm

 

 

 

 

47과 -47을 3비트 이동한 결과를 보자

 

 

 

이동 연산자의 계산

오른쪽 이동 연산자는 비트 이동을 한 번 할 때마다 연산자를 2로 나누는 효과

왼쪽쪽 이동 연산자는 비트 이동을 한 번 할 때마다 연산자를 2로 곱하는 효과

a >> b의 결과는 a / 2^b (a가 양수인 경우)

a << b의 결과는 a * 2^b

 

9 << 3의 결과는 9 * 2^3 = 72

 

 

 

 

축약 대입 연산자

대입 연산자와 산술연산자를 합쳐 놓은 듯한 연산자

왼쪽 피연산자 위치는 변수만 올 수 있다.

 

x = 3;

y = 3;

x += y + 3 * 4;

   -> x + (y + 3 * 4);

 

연산 평가 값 x = 19

 

 

 

축약 대입 연산자 의미
x += y x = x + y
x -= y x = x - y
x *= y x = x * y
x /= y x = x / y
x %= y x = x % y
x &= y x = x & y
x |=y x = x | y
x ^= y x = x^y
x >>= y x = x >> y
x <<= y x = x << y

 

 

 

 

 

 

 

10과 7을 입력한다.

X는 이전 값이 계속 남아 있다.