C언어 unpack함수 작성요
글쓴이: 여리왕자 / 작성시간: 토, 2005/10/15 - 5:46오후
#include <stdio.h> #include <limits.h> #include <conio.h> int pack( char, char, char, char ); void unpack( int, char *, char *, char *, char * ); void bit_print( int ); void main (void) { int num=3, i; int packed_num = pack('a','b','c','d'); printf("abcd= "); bit_print( packed_num ); unpack( packed_num, &(packed_num >> CHAR_BIT), &(packed_num >> CHAR_BIT*2), &(packed_num >> CHAR_BIT*3), &(packed_num >> CHAR_BIT)*4 ); putchar ('\n'); getch(); } int pack(char a, char b, char c, char d) { int p = a; p = (p << CHAR_BIT) | b; p = (p << CHAR_BIT) | c; p = (p << CHAR_BIT) | d; return p; } void unpack(int p, char *pa, char *pb, char *pc,char *pd ) { unsigned mask = 255; p & mask; p & mask; p & mask; p & mask; } void bit_print( int a ) { int i; int n = sizeof(int) * CHAR_BIT; int mask = 1 << (n - 1); for (i = 1; i <= n; ++i) { putchar(((a & mask) == 0) ? '0' : '1'); a <<= 1; if (i % CHAR_BIT == 0 && i < n) putchar(' '); } }
[문제]
-----------------------------------------------------------------------
위에서 나타난 unpack 함수를 전체 바이트들을 한꺼번에
unpack 하도록 다시 작성하라. 4-바이트 워드를 사용하는 컴퓨터인 경우 이 함수는 다음과 같이 시작하게 하라.
void unpack(int p, char *pa, char *pb, char *pc,char *pd)
{
unsigned mask=255;
....
-----------------------------------------------------------------------
위의 소스는 제가 임의로 생각나는 대로 작성했다가 에러가 난 소스인데요... 두 정수를 매개 변수로 받아오는 경우는은 차례로 CHAR_BIT에 1,2,3,4를 곱해서 8bit씩 나눠서 unpack하는것은 알겠거든요...
근데 char의 포인터 값을 받아와서 하라는건... 잘 모르겠네요...
생각나는건... 그냥 각 포인터 매개변수에 int p의 값을 8, 16, 32이렇게... 쉬프트 시킨 주소값을 넘겨 받아서 8bit의 11111111 과 &연산을 해야겠다는 막연한 생각은 나는데요..
포인터의 개념도 제대로 잡혀있지 않은 상태라...
고수님들... 조금만 도와주세요... ㅠㅠ;;
대강 방법이라도...
Forums:
비트연산자에 대해서 별루 관심이 없었는데... 재미있군요.근데...
비트연산자에 대해서 별루 관심이 없었는데... 재미있군요.
근데... 꼭 숙제같은 그런 뉘양스가...
unpack함수에서 *가 아니라 &를 써야 하지 않을까요???
main함수에서 받아 쓰실려구 하신다면...
아니라면 void unpack(int)이정도로도 좋지 않을까요???
안에서 for문 써서 쉬프트해줬는데 잘 되더군요.
근데 정수의 가의 가운데 주소를 가져와서 마스크 씌운다는게 좀 이상하네요.
0xff으로 마스크를 씌우면 뒷쪽 8(CHAR_BIT)비트만 가져오게 되는데 앞이 얼마이든 상관이 없지 않나요??? 앞부터 가져오기 할려면 마스크값을 계속 거기에 맞게 변경 시켜줘야 할것 같은데요.
아~ 그리고 포인터에서 +연산을 하면 선언한 형만큼 띄워지는것으로 알고 있는데요. 일정 비트만큼 띄운 주소를 얻기라... 이거 가능한건지 모르겠네요. 아시는분 답변좀... ㅡ,.ㅡ;;; :oops:
------------------------
냐옹~~
댓글 달기