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:
------------------------
냐옹~~
댓글 달기