43
10 10 주주 주주 ©1998-2002 아아아아아 아아아아아아 All rights reserved. 1 10 주주 주주주주 • Bitwise 아아아아 아아아아 ? • Bitwise 아아아아 아아아 아아 • Bitwise 아아아 아아 • Enumeration 아아 아아아아 ? • Preprocessor 아 아아아아 ?

10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

  • View
    222

  • Download
    2

Embed Size (px)

Citation preview

Page 1: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 1

10 주차 학습내용• Bitwise 연산자란 무엇인가 ?• Bitwise 연산자의 종류와 기능• Bitwise 연산의 응용• Enumeration 이란 무엇인가 ?• Preprocessor 란 무엇인가 ?

Page 2: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 2

Bitwise Bitwise 연산자란 무엇인가연산자란 무엇인가 ??

Bitwise 연산자– 이진수로 표현된 정수형 수식에서 돌아가는 연산자로 시스템에 종속적이다 .– 논리 bitwise 연산자와 이동 (shift) bitwise 연산자로 이루어진다 .

논리 연산자– ~ : bitwise complement– & : bitwise AND– | : bitwise OR– ^ : bitwise exclusive OR

이동 (shift) 연산자– << : left shift– >> : right shift

Bitwise 연산자의 이용 범위– Low-level 연산 (system dependent) 및 효율적인 연산시 이용– 예 ) image processing, data 압축 / 복원 , …

Page 3: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 3

Bitwise Bitwise 연산자의 종류와 기능 연산자의 종류와 기능 (~)(~)

~ 은 bitwise Complement 또는 1 의 보수 (one’s complement) 연산자로 불리운다 . 기능

– Unary 연산자로 다른 unary 연산자와 비슷한 우선순위와 결합순서를 갖는다 .– 주어진 피연산자의 bit 표현의 각 bit 를 1 은 0 으로 0 은 1 로 바꾼다 .

예제int a = 0xFFFF, b = 0x0000, c = 0x00ff;~a 0000 0000 0000 0000~b 1111 1111 1111 1111~c 1111 1111 0000 0000~(~a) 1111 1111 1111 1111

2 의 보수 컴퓨터– 음의 정수를 표현할 때 이 수의 양의 정수의 2 의 보수로 표현하는 컴퓨터– 2 의 보수는 1 의 보수에 1 을 더하여 구한다 .– 예제

int a = 0x01, b = 0x00;~a + 1 1111 1111 1111 1110 + 1 1111 1111 1111 1111 -1 ~b + 1 1111 1111 1111 1111 + 1 0000 0000 0000 0000 0

Page 4: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 4

Bitwise Bitwise 연산자의 종류와 기능 – 연산자의 종류와 기능 – ( &, ^, |)( &, ^, |)

&, ^, | 은 bitwise and, bitwise exclusive-or, bitwise inclusive-or 연산자로 각각 불리운다 .

기능– 이항연산자로 우선순위는 &, ^, | 순이고 결합순서는 좌에서 우 (left to right) 이다 .– 이들 연산자는 피연산자로 정수를 취하고 두 피연산자들은 integral promotion 규칙이

적용된다 .– &(bitwise and) 연산자는 주어진 피연산자들의 각 대응하는 bit 의 값이 모두 1 인 경우

1 로 그렇지 않은 경우 0 이된다 .– ^(bitwise exclusive-or) 연산자는 주어진 피연산들의 각 대응하는 bit 의 값이 서로

다른 경우 1 로 같은 경우 0 이 된다 .– |(bitwise inclusive-or) 연산자는 주어진 피연산들의 각 대응하은 bit 의 값 중 1 이

있는 경우 1 로 그렇지 않은 경우 0 이된다 .

Page 5: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 5

Bitwise Bitwise 연산자의 종류와 기능 – 연산자의 종류와 기능 – ( &, ^, |)( &, ^, |)

예제int a = 0xFFFF, b = 0x0000, c = 0x00ff, d = 0xff00;

a & c 1111 1111 1111 1111 (a)

0000 0000 1111 1111 (c)

0000 0000 1111 1111

c | d 0000 0000 1111 1111 (c)

1111 1111 0000 0000 (d)

1111 1111 1111 1111

a ^ b 1111 1111 1111 1111 (a)

0000 0000 0000 0000 (b)

1111 1111 1111 1111

Page 6: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 6

Bitwise Bitwise 연산자의 종류와 기능 – 연산자의 종류와 기능 – ( <<, >>)( <<, >>)

<<, >> 은 좌측 이동 (left shift), 우측 이동 (right shift) 연산자로 각각 불리운다 . 기능

– 이항연산자로 우선순위는 두 연산자는 서로 갖고 +, - 연산자의 밑에 있고 관계연산자 위에 있으며 결합순서는 좌에서 우 (left to right) 이다 .

– 이들 연산자는 피연산자로 정수를 취하고 두 피연산자들은 integral promotion 규칙이 적용된다 .

– <<(left shift) 연산자는 두 번째 피연산자의 수만큼 첫 번째 피연산자의 bit 들을 좌측으로 이동시킨다 . Bit 이 좌측으로 이동될 때 최하위 bit 은 0 으로 채워진다 .

a << 2– >>(right shift) 연산자는 두 번째 피연산자의 수만큼 첫 번째 피연산자의 bit 들을

우측으로 이동시킨다 . Bit 이 우측으로 이동될 때 첫 번째 연산자가 unsigned 정수이면 최상위 bit 은 0 으로 채워지고 signed 정수이면 시스템에 따라 0 또는 1 이 채워진다 .

a >> 2– <<, >> 연산자의 두 번째 피연산자의 값이 음수이거나 첫 번째 피연산자의 bit 의 수를

초과한 경우 연산의 결과는 정의되어있지 않다 .

Page 7: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 7

Bitwise Bitwise 연산자의 종류와 기능 – 연산자의 종류와 기능 – ( <<, >>)( <<, >>)

예제int c = 0x00ff, d = 0xff00;

c << 2 0000 0000 1111 1111

2

0000 0011 1111 1100

c >> 2 0000 0000 1111 1111

2

0000 0000 0011 1111

d << 3 1111 1111 0000 0000

3

1111 1000 0000 0000

d >> 3 1111 1111 0000 0000

3

1111 1111 1110 0000 또는 0001 1111 1110 0000

Page 8: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 8

Bitwise Bitwise 연산의 응용연산의 응용

비트레벨 연산의 응용 : packing multiple flags into an int

#define READ 1 /* 0000 0001 */

#define WRITE 2 /* 0000 0010 */

#define READ_WRITE 3 /* 0000 0011 */

#define EOF 4 /* 0000 0100 */

#define ERROR 8 /* 0000 1000 */

char status= 0; /* set of flags for I/O status */

/* Turn WRITE flag on */

status = status | WRITE;

/* Turn ERROR flag on */

status = status | ERROR;

/* Test if READ state */

if(status & READ ) ...

/* Turn ERROR flag off */

status = status & ~ERROR;

★ Mask 란 변수나 식의 특정 bit들을 추출하거나 수정할 때 사용하는 상수나 변수를 지칭한다 .

Page 9: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 9

Bitwise Bitwise 연산의 응용 연산의 응용 - - 계속계속

packing/unpacking four chars into/from one long int

long pack(char a, char b, char c, char d)

{

long p = a;

p = (p << 8) | b;

p = (p << 8) | c;

p = (p << 8) | d;

return p;

}

char unpack(long p, int k) /* k = 0, 1, 2, or 3*/

{

int n = k* 8; /* n = 0, 8, 16, or 32 */

unsigned long mask = 255; /* 0000 0000 0... 0000 1111 1111 */

mask <<= n;

return ((p & mask) >> n);

}

Page 10: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 10

EnumerationEnumeration 이란 무엇인가이란 무엇인가 ??

열거형 (enumeration) 타입– 유한 집합의 이름을 명명하고 그 집합의 원소 (enumerator) 들 각각을 식별자로

선언하여 사용하는 방법을 제공하는 사용자 정의 데이터 타입이다 .

열거형의 정의enum tag_name {enumerator, … };예 ) enum card_type {Kuang, Ten, Five, Zero};

typedef 를 이용하여 구조체에와 비슷하게 열거형 정의를 간단하고 의미있게 재정의할 수 있다 .예 ) typedef cart_type CARD;

열거형 변수의 선언enum car_type card1, card2;CARD *ptr;

Page 11: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 11

EnumerationEnumeration 이란 무엇인가이란 무엇인가 ??

enumerator 는 정수형의 상수로 디폴트로 첫번째 나오는 enumerator 의 값은 0 이고 다음에 나오는 enumerator 들은 앞의 것보다 1 큰 값을 갖는다 . 예제의 경우 Kunag은 0, Ten 은 1, Five 는 2, Zero 은 3 이다 .

열거형 타입의 변수는 값으로 정의에 존재하는 enumerator 만을 가질 수 있다 . 열거형 타입의 정의와 선언 예

enum grade {A = 90, B = 80, C = 70, D = 60, E = 50, F = 50};

enum grade gr1, gr2;

enum day {mon = 1, tue, wed, thu, fri, sat, sun} day, day1;

typedef enum day day;

day day1, day2;

enum {mon = 1, tue, wed, thu, fri, sat, sun} day, day1;

typedef enum day {mon = 1, tue, wed, thu, fri, sat, sun} day;

Page 12: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 12

EnumerationEnumeration 의 사용 예의 사용 예

주어진 grade 를 출력한다 .

enum grade {A = 90, B = 80, C = 70, D = 60, E = 50, F = 50};typede enum grade GRADE;void GetGrade(GRADE grade){ switch(grade){ case A: printf(“The grade is A.\n”); break; case B: printf(“The grade is B.\n”); break; case C: printf(“The grade is C.\n”); break; case D: printf(“The grade is D.\n”); break; case E: printf(“The grade is E.\n”); break; case F: printf(“The grade is F.\n”); break; }}

Page 13: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 13

PreprocessorPreprocessor 란 무엇인가란 무엇인가 ??

전처리기 (Preprocessor) 는 말 그대로 프로그램을 컴파일하기 전에 프로그램에서 전처리기에게 지시한 사항들을 처리하는 일을 수행한다 . 이것은 C 언어의 파워와 표기 방법의 확장을 위해 사용된다 .

프리프로세서의 기능–매크로정의–파일삽입기능 ( 헤더파일등의 삽입을 위해 )–조건부 컴파일 (debugging, portability 등을 위해 )

프리프로세서 지시자–#define : 매크로 정의 –#undef : 정의된 매크로 정의 무효화–#include : 다른 화일을 삽입–#if #else #endif–#if #elif #endif 조건부컴파일–#ifdef #endif–#ifndef #endif–등등

Page 14: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 14

Preprocessor Preprocessor 지시자 지시자 - #define, #undef- #define, #undef

#define 및 #undef 지시자–용도 : 기호상수 및 매크로 정의–사용형식

#define 기호상수 문자열#define 매크로명 ( 매개변수 ) 문자열#undef 매크로명

☞ 문자열이 너무 길어 다음 줄로 이어질 경우 현재 라인의 끝에 \ 를 추가하고 다음 줄에 나머지 부분을 이어서 작성할 수 있다 .

☞ 매크로의 경우 첫 번째 매개변수와 왼쪽 가로는 서로 붙어 있어야 한다 .

사용예 ( 매개변수가 없는 경우 )–#define SIZE 80–#define TEXT unsigned char–TEXT array[SIZE];

–( 매크로 확장후 )–unsigned char array[80];

★ 프리프로세서는 기호상수가 정의된 이후에 출현한 모든 기호상수를 대응하는 문자열로 모두 대체한다 . 다만 “”안에 문자열은 제외된다 .

Page 15: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 15

Preprocessor Preprocessor 지시자 지시자 - #define, #undef- #define, #undef

매개변수가 있는 경우–#define max(x,y) (((x) > (y)) ? (x) : (y))–e = max(a+b, c+d);–( 매크로확장 후 )–e = (((a+b) > (c+d)) ? (a+b) : (c+d));

–#define SQARE(x) (x)*(x)–e = SQARE(a+b);–( 매크로확장 후 )–e = (a+b)*(a+b);

–#define SQARE(x) x*x–e = SQARE(a+b);–( 매크로확장 후 )–e = a+b*a+b; 의도한 결과를 얻을 수 없다 .

Page 16: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 16

Preprocessor Preprocessor 지시자 지시자 - #define, #undef- #define, #undef

매크로와 함수의 유사성와 차이점–유사성 : 반복적으로 사용되는 긴 코드를 간략한 이름으로 호출하여 반복적으로 사용할 수 있다 .–차이점 :

매크로컴파일시에 확장후 수행길다빠르다없다 (에러가능성 )

함수수행시 함수코드로 분기짧다느리다있다

매크로호출코드길이수행속도 매개변수의 type

Page 17: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 17

Preprocessor Preprocessor 지시자 지시자 - #include- #include

#include 지시자–용도 : 다른 원시화일을 삽입 ( 주로 헤더파일 )–사용형식

#include < 파일명 > : 지정된 시스템 디렉토리내의 파일 삽입#include “ 파일명” : 현재 디렉토리내의 파일 삽입

–사용 예#include <stdio.h>

#include <math.h>

main()

{

...

printf(“cosine of %f is %f\n”, val, cos(val));

...

}

Page 18: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 18

Preprocessor Preprocessor 지시자 지시자 - #if, #ifdef, #ifndef- #if, #ifdef, #ifndef

#if 및 #ifdef #ifndef 지시자 –용도 : 프로그램의 코드 일부분을 선택적으로 컴파일하는 지시자–사용형식 : #elif, #else, #endif 와 함께 사용

#if 상수수식 문장 1#else 문장 2#endif

#if 상수수식 1 문장 1#elif 상수수식 2 문장 2....#else 문장 n#endif

#ifdef 매크로명 문장 1#else 문장 2#endif

#ifndef 매크로명 문장 1#else 문장 2#endif

Page 19: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 19

Preprocessor Preprocessor 지시자 지시자 - #if, #ifdef, #ifndef- #if, #ifdef, #ifndef

#if #elif #else #endif 의 사용 예

#define US 0

#define UK 1

#define FR 2

#define ACTIVE_CURRENCY US

#if ACTIVE_CURRENCY == US

char currency[]=“dollar”;

#elif ACTIVE_CURRENCY == UK

char currency[]=“pound”;

#else

char currency[]=“franc”;

#endif

Page 20: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 20

Preprocessor Preprocessor 지시자 지시자 - #if, #ifdef, #ifndef- #if, #ifdef, #ifndef

#ifdef #endif 의 사용예

#define DEBUG

....#ifdef DEBUG printf(“Debug : a = %d\n”, a);#endif

#define HP9000

#ifdef HP9000 code for HP9000#elif ifdep SUN_SPARC code for SUN_SPARC#else code for IBM_RS6000#endif

Page 21: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 21

< < 암호화 문제암호화 문제 -Bitwise -Bitwise 연산자 사용연산자 사용 >>

(( 예제 예제 6) 6) 주어진 문자열을 암호화하여 출력하고 반대로 암호화된 것을 복호화하여 주어진 문자열을 암호화하여 출력하고 반대로 암호화된 것을 복호화하여 출력하는 문제로 각 문자에 대응하는 코드는 테이블로 주어진다출력하는 문제로 각 문자에 대응하는 코드는 테이블로 주어진다 . . 코드는 길이가 코드는 길이가 가변이고 이진수로 표현된다가변이고 이진수로 표현된다 . . 각 코드는 서로 포함되지 않도록 한다각 코드는 서로 포함되지 않도록 한다 . . 이것은 암호화된 이것은 암호화된 것을 원 문자열로 복호화되는 것을 보장하기 위해서 이다것을 원 문자열로 복호화되는 것을 보장하기 위해서 이다 . . 이때 암호화된 결과들은 이때 암호화된 결과들은 바이트 단위로 좌측에서부터 빈곳이 없이 채워진다바이트 단위로 좌측에서부터 빈곳이 없이 채워진다 ..

코드 테이블코드 테이블

문자 코드 길이

a 1 1

b 01 2

c 000 3

주어진 문자열 : ababac암호화된 문자열 : 10110110 00 2 바이트에 들어감.

Page 22: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 22

Level 1 Pseudo codeLevel 1 Pseudo code

1. 코드 테이블을 사용자로부터 입력 받는다 .

2. 암호화할 문자열을 사용자로부터 입력 받는다 .

3. 암호화할 문자열을 암호화 한다 .

4. 암호화된 결과를 출력 한다 .

5. 암호화된 결과를 복호화 한다 .

6. 복호화된 결과를 출력 한다 .

Page 23: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 23

기능별 구조기능별 구조

주 프로그램

문자열암호화

EncryptString

암호화문자열출력

WriteBitString

Bit 문자열복호화

DecryptBitString

코드테이블입력

ReadCodeTable

Page 24: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 24

Level 2 Pseudo code Level 2 Pseudo code

program /* 코드 테이블을 사용자로부터 입력 받는다 . */ ReadCodeTable()

/* 암호화할 문자열을 사용자로부터 입력 받는다 . */ Read 암호화할 문자열

/* 암호화할 문자열을 암호화 한다 . */ EncryptString()

/* 암호화된 결과를 출력 한다 . */ WriteBitString()

/* 암호화된 결과를 복호화 한다 . */ DecryptBitString()

/* 복호화된 결과를 출력 한다 . */Write 복호화된 문자열

endprogram

Page 25: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 25

Level 2 Pseudo code (Level 2 Pseudo code ( 계속계속 ))

/* 코드 테이블을 사용자로부터 입력 받는다 . */function ReadCodeTable()in : 없음out : 읽은 코드 테이블 정보return : 코드의 수 while( 더 이상의 코드가 없을 때까지 ) 코드 정보를 읽는다 . endwhileendfunction

/* 암호화할 문자열을 사용자로부터 입력 받는다 . */Read 암호화할 문자열

Page 26: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 26

Level 2 Pseudo code (Level 2 Pseudo code ( 계속계속 ))

/* 암호화할 문자열을 암호화 한다 . */function EncryptString()in : 암호화할 문자열 , 암호화할 문자열의 길이out : 암호화된 Bit 문자열 , 암호화된 문자열의 bit 수return : 암호화된 문자열의 bit 수

for i = 1 to 암호화할 문자열의 길이 step 1 i 번째 문자가 코드 테이블에 있는 위치 (position) 를 찾는다 . if(i 번째 문자가 코드 테이블에 존재한다면 ) 암호화된 문자열에 찾은 코드를 추가한다 . endifendfor

endfunction

/* 암호화된 결과를 출력 한다 . */function WriteBitString()in : 암호화된 문자열 , 암호화된 문자열의 bit 수out : 없음return : 없음 for i = 1 to 암호화된 문자열의 bit 수 step 1

i 번째 bit 의 2 진수 값을 출력한다 .endfor

endfunction

Page 27: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 27

Level 2 Pseudo code (Level 2 Pseudo code ( 계속계속 ))

/* 암호화된 결과를 복호화 한다 . */

function DecryptBitString()

in : 암호화된 문자열 , 암호화된 문자열의 bit 수out : 복호화된 문자열 , 복호화된 문자열의 길이return : 복호화된 문자열의 길이

for i = 1 to 암호화된 문자열의 bit 수 step 1 i 번째 bit 을 현재까지 읽어들인 비트열에 추가한다 .

비트열이 코드 테이블에 있는 위치 (position) 을 찾는다 .

if( 비트열이 코드 테이블에 존재한다면 )

코드 테이블에 있는 문자를 복호화 문자열에 추가한다 .

비트열을 비운다 .

endif

endfor

endfunction

/* 복호화된 결과를 출력 한다 . */

write 복호화된 문자열

Page 28: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 28

기능별 구조기능별 구조

주 프로그램

문자열암호화

EncryptString

암호화문자열출력

WriteBitString

Bit 문자열복호화

DecryptBitString

코드테이블입력

ReadCodeTable

코드 테이블에서알파벳 위치

찾기

SearchAlphabet

암호화 문자열에코드 추가

AttachCode

코드 테이블에서코드 위치

찾기

SearchCode

Page 29: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 29

자료구조자료구조

문자 , 문자에 대응하는 코드 문자열 , 코드 문자열의 길이를 멤버로 갖는 구조체를 구성한다 .

struct code_data : 각 문자에 대응하는 코드를 유지 alphabet : 문자 code : 문자에 대응되는 코드 문자열 lengthOfCode : 코드 문자열의 길이endstruct

array codeTable(MAX_CODE_NUMBER) : 각 문자에 대응하는 코드를 유지하는 테이블로 code_data 구조체 배열로 MAX_CODE_NUMBER 만큼 사용한다 . 암호화를 할 경우 주어진 문자의 코드를 찾는데 사용되고 복호화의 경우 주어진 코드에 대응하는 문자를 찾는데 사용된다 .

Page 30: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 30

자료구조자료구조

array bitMask_OR(MAX_BIT_MASK_NUMBER) : 1 바이트의 각 위치에 대한 마스크로 code 에 존재하는 1 의 값이 암호화된 문자열의 특정 위치에 추가하기위해 필요하다 .

array bitMask_AND(MAX_BIT_MASK_NUMBER) : 1 바이트의 각 위치에 대한 마스크로 code 에 존재하는 0 의 값이 암호화된 문자열의 특정 위치에 추가하기위해 필요하다 .

bitMask[0] = 1000 0000

bitMask[1] = 0100 0000

bitMask[2] = 0010 0000

bitMask[3] = 0001 0000

bitMask[4] = 0000 1000

bitMask[5] = 0000 0100

bitMask[6] = 0000 0010

bitMask[7] = 0000 0001

bitMask_ADN[0] = 0111 1111

bitMask_ADN[1] = 1011 1111

bitMask_ADN[2] = 1101 1111

bitMask_ADN[3] = 1110 1111

bitMask_ADN[4] = 1111 0111

bitMask_ADN[5] = 1111 1011

bitMask_ADN[6] = 1111 1101

bitMask_ADN[7] = 1111 1110

Page 31: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 31

Source code Source code

#include <stdio.h>

#include <string.h>

#define MAX_CODE_LENGTH 16

#define MAX_CODE_NUMBER 32

#define MAX_STRING_LENGTH 1024

#define MAX_BIT_MASK_NUMBER 8

//

typedef struct code_tag{

char alphabet;

char code[MAX_CODE_LENGTH];

int lengthOfCode;

} CODE;

Page 32: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 32

Source code (Source code ( 계속계속 ))

/* 코드 테이블을 사용자로부터 입력 받는다 . */int ReadCodeTable(CODE codeTable[]);

/* 암호화할 문자열을 암호화 한다 . */int EncryptString(char original_String[], int length_Of_Original_String, CODE codeTable[], int cnt_Of_Codes, char encoded_String[]);

/* 암호화된 결과를 출력 한다 . */void WriteBitString(char encoded_String[], int cnt_Of_EncodedBits);

/* 암호화된 결과를 복호화 한다 . */int DecryptBitString(char encoded_String[], int cnt_Of_EncodedBits, CODE codeTable[], int cnt_Of_Codes, char decoded_String[]);

/* 주어진 문자의 코드 테이블에서의 위치를 찾는다 . */int SearchAlphabet(char key, CODE codeTable[], int cnt_Of_Codes);

/* 주어진 코드를 암호화된 문자열에 추가한다 . */void AttachCode(char encoded_String[], int cnt_Of_Bits, char code[], int lengthOfCode);

/* 주어진 코드의 코드 테이블에서의 위치를 찾는다 . */int SearchCode(char key[], CODE codeTable[], int cnt_Of_Codes);

Page 33: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 33

Source code (Source code ( 계속계속 ))

char bitMask_OR[MAX_BIT_MASK_NUMBER];char bitMask_AND[MAX_BIT_MASK_NUMBER];

int main(){

int i;char original_String[MAX_STRING_LENGTH];char encoded_String[MAX_STRING_LENGTH];char decoded_String[MAX_STRING_LENGTH];int lengthOfEncodedString, lengthOfDecodedString;int cnt_Of_EncodedBits = 0;

CODE codeTable[MAX_CODE_NUMBER];int cnt_Of_Codes;

// 암호화에 사용될 매스크를 만든다 .for(i = 0; i < 8; i++){

bitMask_OR[i] = 1 << (7 - i);bitMask_AND[i] = bitMask_OR[i] ^ 0xFF;

}

Page 34: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 34

Source code (Source code ( 계속계속 ))

// 코드 테이블을 사용자로부터 입력 받는다 .

cnt_Of_Codes = ReadCodeTable(codeTable);

// 암호화할 문자열을 입력 받는다 .

printf("Enter the string for encryption.\n");

scanf("%s", original_String);

// 주어진 문자열을 암호화 한다 .

cnt_Of_EncodedBits = EncryptString(original_String, strlen(original_String), codeTable, cnt_Of_Codes, encoded_String);

// 암호화된 결과를 출력한다 .

printf("The number of an encoded string bits : %d\n", cnt_Of_EncodedBits);

lengthOfEncodedString = cnt_Of_EncodedBits/8;

if(cnt_Of_EncodedBits%8)

lengthOfEncodedString++;

printf("The length of an encoded string : %d\n", lengthOfEncodedString);

Page 35: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 35

Source code (Source code ( 계속계속 ))

// 각 bit 값을 출력한다WriteBitString(encoded_String, cnt_Of_EncodedBits);

// 암호화된 것을 복호화한다 .

lengthOfDecodedString = DecryptBitString(encoded_String, cnt_Of_EncodedBits, codeTable, cnt_Of_Codes, decoded_String);

// 복호화된 결과를 출력한다 .

printf("Decryption result : %s\n", decoded_String);

return 0;

}

Page 36: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 36

Source code (Source code ( 계속계속 ))

/* 코드 테이블을 사용자로부터 입력 받는다 . */

int ReadCodeTable(CODE codeTable[])

{

int cnt = 0;

while(cnt < MAX_CODE_NUMBER && scanf("%c %s", &codeTable[cnt].alphabet, codeTable[cnt].code) == 2){

fflush( stdin );

codeTable[cnt].lengthOfCode = strlen(codeTable[cnt].code);

cnt++;

}//while

}

Page 37: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 37

Source code (Source code ( 계속계속 ))

/* 암호화할 문자열을 암호화 한다 . */int EncryptString(char original_String[], int length_Of_Original_String, CODE codeTable[],

int cnt_Of_Codes, char encoded_String[]){

int i;int pos;int cnt_Of_Bits = 0;

// 주어진 문자열을 암호화 한다 .for(i = 0; i < length_Of_Original_String; i++){

pos = SearchAlphabet(original_String[i], codeTable, cnt_Of_Codes);if(pos >= 0){

AttachCode(encoded_String, cnt_Of_Bits, codeTable[pos].code, codeTable[pos].lengthOfCode);

cnt_Of_Bits += codeTable[pos].lengthOfCode;}else{

printf("%c does not exist in code table!!!\n", original_String[i]);return -1;

}}//for

return cnt_Of_Bits;}

Page 38: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 38

Source code (Source code ( 계속계속 ))

/* 암호화된 결과를 출력 한다 . */void WriteBitString(char encoded_String[], int cnt_Of_EncodedBits){

int i;int pos = 0;char a;

// 암호화된 문자열의 각 bit 에 대하여for(i = 0; i < cnt_Of_EncodedBits; i++){

// 1 바이트를 모두 출력한 경우 다음 바이트의 값을 얻음if(i%8 == 0){

putchar(' ');a = encoded_String[pos++];

}

// 현재 bit 의 값을 출력한다 .putchar(((a & bitMask_OR[0]) == 0) ? '0' : '1');

// bit 들을 왼쪽으로 1 이동시킨다 .a <<= 1;

}//for

putchar('\n');}

Page 39: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 39

Source code (Source code ( 계속계속 ))

/* 암호화된 결과를 복호화 한다 . */int DecryptBitString(char encoded_String[], int cnt_Of_EncodedBits, CODE codeTable[], int

cnt_Of_Codes, char decoded_String[]){

int i, index;int pos = 0;int length_of_DecodedString = 0;char code[MAX_CODE_LENGTH] = {'\0'};char a;

// 암호화된 문자열의 각 bit 에 대하여for(i = 0; i < cnt_Of_EncodedBits; i++){

// 1 바이트를 모두 처리한 경우 다음 바이트의 값을 얻음if(i%8 == 0)

a = encoded_String[pos++];

// code 에 주어진 비트를 추가한다if(a & bitMask_OR[0])

strcat(code, "1");else

strcat(code, "0");

// bit 들을 왼쪽으로 1 이동시킨다 .a <<= 1;

Page 40: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 40

Source code (Source code ( 계속계속 ))

index = SearchCode(code, codeTable, cnt_Of_Codes);

if(index != -1){

// 복호화 문자열에 현재 코드의 문자를 추가한다 .

decoded_String[length_of_DecodedString] = codeTable[index].alphabet;

length_of_DecodedString++;

// 다음 코드를 얻기 위하여 코드를 비운다 .

code[0] = '\0';

}

}//for

decoded_String[length_of_DecodedString] = '\0';

return length_of_DecodedString;

}

Page 41: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 41

Source code (Source code ( 계속계속 ))

/* 주어진 문자의 코드 테이블에서의 위치를 찾는다 . */

int SearchAlphabet(char key, CODE codeTable[], int cnt_Of_Codes)

{

int i;

int index = -1;

// tableOfCode 에서 주어진 문자가 들어있는 위치 (position) 를 찾는다 .

for(i = 0; i < cnt_Of_Codes; i++)

if(codeTable[i].alphabet == key){

index = i;

break;

}

return index;

}

Page 42: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 42

Source code (Source code ( 계속계속 ))

/* 주어진 코드의 코드 테이블에서의 위치를 찾는다 . */

int SearchCode(char key[], CODE codeTable[], int cnt_Of_Codes)

{

int i;

int index = -1;

// tableOfCode 에서 주어진 문자가 들어있는 위치 (position) 를 찾는다 .

for(i = 0; i < cnt_Of_Codes; i++)

if(strcmp(codeTable[i].code, key) == 0){

index = i;

break;

}

return index;

}

Page 43: 10 주차 ©1998-2002 아주대학교 정보통신대학 All rights reserved. 1 10 주차 학습내용 Bitwise 연산자란 무엇인가 ? Bitwise 연산자의 종류와 기능 Bitwise

1010 주차주차1010 주차주차

©1998-2002 아주대학교 정보통신대학 All rights reserved. 43

Source code (Source code ( 계속계속 ))

/* 주어진 코드를 암호화된 문자열에 추가한다 . */void AttachCode(char encoded_String[], int cnt_Of_Bits, char code[], int lengthOfCode){

int i;int lengthOfEncodedString, lastBitPosition;

lengthOfEncodedString = cnt_Of_Bits/8;lastBitPosition = cnt_Of_Bits%8;

// code 를 encoded_String 에 추가한다 .for(i = 0; i < lengthOfCode; i++){

if(code[i] == '1')encoded_String[lengthOfEncodedString] |= bitMask_OR[lastBitPositio

n];else

encoded_String[lengthOfEncodedString] &= bitMask_AND[lastBitPosition];

lastBitPosition++;if(lastBitPosition == 8){

lastBitPosition = 0;lengthOfEncodedString = lengthOfEncodedString + 1;

}}//for

}