본문내용
;
15 pack_num = pack(day, month, year);
16 bit_print(pack(day, month, year));
17 putchar('\n');
18
19 printf("Unpack day, month, year: \n");
20 printf("%d\t", unpack(pack_num, 11)); //day는 상위 5비트만 언패킹.
21 printf("%d\t", unpack(pack_num, 7)); //month는 가운데 4비트를 언패킹
22 printf("%d\t", unpack(pack_num, 0)); //year는 하위 7비트를 언패킹.
23 putchar('\n');
24 return 0;
25 }
26 short pack(int day, int month, int year)
27 {
28 short pack_year = day; //day is 5 bit.
29
30 pack_year = (pack_year << 4) | month;
31 pack_year = (pack_year << 7) | year;
33 }
34 short unpack(short pack_num, int d_m_y)
35 {
36 unsigned mask_day = 63488, mask_mon = 1920, mask_year = 127;
37 //63488은 1111100000000000, 1920은 0000011110000000, 127은 0000000001111111
38 if (d_m_y == 11) //하위 11비트를 제외한 언패킹.
39 return ((pack_num & mask_day) >> d_m_y);
40 else if (d_m_y == 7) //하위 7비트를 제외한 언패킹.
41 return ((pack_num & mask_mon) >> d_m_y);
42 else //하위 비트를 언패킹.
43 return ((pack_num & mask_year) >> d_m_y);
44 }
문제 24.
7.4절 "패킹과 언패킹"에서 제시한 pack() 함수를 생각해 보자. 이 함수의 몸체는 4개의 문장으로 이루어져 있다. 이 4개의 문장이 하나의 return 문으로 통합되도록 함수를 다시 작성하여라.
☞ 1 int pack(char a, char b, char c, char d)
2 {
3 int p = a;
4
5 p = (p << CHAR_BIT) | b;
6 p = (p << CHAR_BIT) | c;
7 p = (p << CHAR_BIT) | d;
8 return p;
9 }
를 한줄로 고치면 이렇게 하면 되지 않을까..
1 int pack(char *a)
2 {
3 return (p = (p << CHAR_BIT) | *(a++));
4 }
문제 25.
pack() 함수를 산술 연산만을 사용하여 작성하여라.
☞ 1 int pack(char a, char b, char c, char d)
2 {
3 int p=a;
4
5 p=(p*256)+b;
6 p=(p*256)+c;
7 p=(p*256)+d;
8 return p;
9 }
문제 26.
어떤 컴퓨터에서는 long 형의 마스크를 허용한다. 그러나 2 바이트 컴퓨터에서 다음과 같이 초기화할 경우, 작성된 코드는 기대했던 것처럼 동작하지 않는다.
long mask = 1 << 31; /* turn the high bit on: error! */
여기에 터무니없는 오류가 있다. 어떤 오류인지 설명하여라.
☞ 2바이트 컴퓨터의 long형은 4바이트이다. 그렇지만 이 4바이트는 2바이트의 메모리를 두 개 사용한 것이다. 그런데 위의 코드 1 << 31은 1을 31칸 shift하라는 것이다. 메모리의 최대 크기가 단지 16비트인 컴퓨터에서 31칸을 shift하라는 것이 오류가 된다.
문제 27.
'abc'와 같은 다중문자 문자 상수의 저장 방법은 시스템에 따라 다르다. 프로그래머는 때때로 "abc"를 'abc' 라고 쓸 수 있기 때문에, 어떤 컴파일러는 다중문자 문자 상수가 사용되면 비록 그 사용이 타당하다 해도 경고 메시지를 생성한다. 사용하고 있는 시스템에서는 어떻게 되는가? 다음 코드를 수행해 보아라.
int c = 'abc';
printf("'abc' = ");
bit_print(c);
printf("\n");
Sun 워크스테이션에서 실행했을 때의 결과는 다음과 같다.
'abc' = 00000000 01100011 01100010 01100001
☞ 실행결과는 일단 경고 메시지를 보여준다. 그렇지만 실행은 된다.
27.c: In function `main':
27.c:6: warning: multi-character character constant
wonhyo[yonglag /33 ~/C/abc/chap7 ] a.out
'abc' = 00000000 01100001 01100010 01100011
문제 28.
집합에 대한 수학적 개념의 유용한 구현은 unsigned long을 최대 32개의 원소로 구성된 집합으로 다루는 것이다.
typedef unsigned long set;
const set empty = 0x0; /* use hexadecimal constants */
비트 연산자를 사용하여 두 집합을 합하는 루틴을 작성하여라. 주의: union은 키워드이므로, 다른 이름을 사용하여라.
/* This function returns the union of a and b. */
set Union(set a, set b);
마스크를 사용하면 원하는 비트가 1 인지를 검사할 수 있다. 이 아이디어를 이용하여 집합의 구성 원소들을 출력하는 다음과 같은 함수 원형을 갖는 함수를 작성하여라.
void display(set a);
이 함수를 검사하기 위해 다음 코드를 사용할 수 있을 것이다.
set a = 0x7; /* a has elements 1, 2, 3 */
set b = 0x55; /* b has elements 1, 3, 5, 7 */
display(Union(a,b)); /* 1, 2, 3, 5, 7 is in the union */
15 pack_num = pack(day, month, year);
16 bit_print(pack(day, month, year));
17 putchar('\n');
18
19 printf("Unpack day, month, year: \n");
20 printf("%d\t", unpack(pack_num, 11)); //day는 상위 5비트만 언패킹.
21 printf("%d\t", unpack(pack_num, 7)); //month는 가운데 4비트를 언패킹
22 printf("%d\t", unpack(pack_num, 0)); //year는 하위 7비트를 언패킹.
23 putchar('\n');
24 return 0;
25 }
26 short pack(int day, int month, int year)
27 {
28 short pack_year = day; //day is 5 bit.
29
30 pack_year = (pack_year << 4) | month;
31 pack_year = (pack_year << 7) | year;
33 }
34 short unpack(short pack_num, int d_m_y)
35 {
36 unsigned mask_day = 63488, mask_mon = 1920, mask_year = 127;
37 //63488은 1111100000000000, 1920은 0000011110000000, 127은 0000000001111111
38 if (d_m_y == 11) //하위 11비트를 제외한 언패킹.
39 return ((pack_num & mask_day) >> d_m_y);
40 else if (d_m_y == 7) //하위 7비트를 제외한 언패킹.
41 return ((pack_num & mask_mon) >> d_m_y);
42 else //하위 비트를 언패킹.
43 return ((pack_num & mask_year) >> d_m_y);
44 }
문제 24.
7.4절 "패킹과 언패킹"에서 제시한 pack() 함수를 생각해 보자. 이 함수의 몸체는 4개의 문장으로 이루어져 있다. 이 4개의 문장이 하나의 return 문으로 통합되도록 함수를 다시 작성하여라.
☞ 1 int pack(char a, char b, char c, char d)
2 {
3 int p = a;
4
5 p = (p << CHAR_BIT) | b;
6 p = (p << CHAR_BIT) | c;
7 p = (p << CHAR_BIT) | d;
8 return p;
9 }
를 한줄로 고치면 이렇게 하면 되지 않을까..
1 int pack(char *a)
2 {
3 return (p = (p << CHAR_BIT) | *(a++));
4 }
문제 25.
pack() 함수를 산술 연산만을 사용하여 작성하여라.
☞ 1 int pack(char a, char b, char c, char d)
2 {
3 int p=a;
4
5 p=(p*256)+b;
6 p=(p*256)+c;
7 p=(p*256)+d;
8 return p;
9 }
문제 26.
어떤 컴퓨터에서는 long 형의 마스크를 허용한다. 그러나 2 바이트 컴퓨터에서 다음과 같이 초기화할 경우, 작성된 코드는 기대했던 것처럼 동작하지 않는다.
long mask = 1 << 31; /* turn the high bit on: error! */
여기에 터무니없는 오류가 있다. 어떤 오류인지 설명하여라.
☞ 2바이트 컴퓨터의 long형은 4바이트이다. 그렇지만 이 4바이트는 2바이트의 메모리를 두 개 사용한 것이다. 그런데 위의 코드 1 << 31은 1을 31칸 shift하라는 것이다. 메모리의 최대 크기가 단지 16비트인 컴퓨터에서 31칸을 shift하라는 것이 오류가 된다.
문제 27.
'abc'와 같은 다중문자 문자 상수의 저장 방법은 시스템에 따라 다르다. 프로그래머는 때때로 "abc"를 'abc' 라고 쓸 수 있기 때문에, 어떤 컴파일러는 다중문자 문자 상수가 사용되면 비록 그 사용이 타당하다 해도 경고 메시지를 생성한다. 사용하고 있는 시스템에서는 어떻게 되는가? 다음 코드를 수행해 보아라.
int c = 'abc';
printf("'abc' = ");
bit_print(c);
printf("\n");
Sun 워크스테이션에서 실행했을 때의 결과는 다음과 같다.
'abc' = 00000000 01100011 01100010 01100001
☞ 실행결과는 일단 경고 메시지를 보여준다. 그렇지만 실행은 된다.
27.c: In function `main':
27.c:6: warning: multi-character character constant
wonhyo[yonglag /33 ~/C/abc/chap7 ] a.out
'abc' = 00000000 01100001 01100010 01100011
문제 28.
집합에 대한 수학적 개념의 유용한 구현은 unsigned long을 최대 32개의 원소로 구성된 집합으로 다루는 것이다.
typedef unsigned long set;
const set empty = 0x0; /* use hexadecimal constants */
비트 연산자를 사용하여 두 집합을 합하는 루틴을 작성하여라. 주의: union은 키워드이므로, 다른 이름을 사용하여라.
/* This function returns the union of a and b. */
set Union(set a, set b);
마스크를 사용하면 원하는 비트가 1 인지를 검사할 수 있다. 이 아이디어를 이용하여 집합의 구성 원소들을 출력하는 다음과 같은 함수 원형을 갖는 함수를 작성하여라.
void display(set a);
이 함수를 검사하기 위해 다음 코드를 사용할 수 있을 것이다.
set a = 0x7; /* a has elements 1, 2, 3 */
set b = 0x55; /* b has elements 1, 3, 5, 7 */
display(Union(a,b)); /* 1, 2, 3, 5, 7 is in the union */
키워드
추천자료
- [C 프로그래밍] C로 배우는 프로그래밍 기초 3장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 4장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 5장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 6장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 7장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 1장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 11장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 12장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 13장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 14장 이해점검 및 프로그램문제 풀이
- [C 프로그래밍] C로 배우는 프로그래밍 기초 16장 이해점검 및 프로그램문제 풀이
- C언어의 원리, C언어의 장단점, C언어의 시작, C++의 추가된 사항, C++의 데이터선언, C++의 ...
- ICC(F.P.A) VS ICC(C) - ICC(F.P.A)조건과 ICC 2009(C)조건의 비교 (ICC(F.P.A)조건, ICC(C)...