본문으로 바로가기

[알고스팟]ENDIAN (2)

category 알고리즘/알고스팟 2017. 5. 10. 23:51
728x90
반응형

안녕하세요. letitkang입니다.


긴 연휴 잘 보내셨나요?


푹쉬다가 왔네요. 너무 쉬다 왔습니다. 이제 푹 쉬었으니 할 일은 해야죠?


다시 포스팅 시작하겠습니다. 지난 포스팅을 적고 2주후에 이번 포스팅을 적네요 ㅠㅠ 죄송합니다.


지난 포스팅에서 알고스팟 사이트의 ENDIAN 문제를 알아보았고, 오늘 제가 짠 소스코드를 보여드리겠습니다.


ENDIAN 문제를 다시 한번 보겠습니다.


 

 

 



-> 두 국가가 있는데 한국가는 리틀엔디안을 사용하고, 한 국가는 빅엔디안을 사용합니다. 엔디안에 관련된 문제로 보입니다.


즉 두 국가간의 데이터 교환에는 리틀엔디안을 빅엔디안으로, 빅엔디안을 리틀엔디안으로 바꾸는 과정이 필요합니다.


1에서 10000사이의 값을 입력 받고, 데이터 변환 과정을 거처서 unsigned int를 출력하는 프로그램을 만들어야됩니다.




알고리즘은 간단합니다.


빅엔디안, 리틀엔디안 변환을을 위해서 char변수 4개의 구조체를 만들고, 정수를 입력받은 후, 정수를 구조체에 넣고, 구조체 안의 char 변수의 자리를 바꾼 후, 바뀐 정수를 출력하게 하였습니다.


저의 알고리즘이 쉬워 보이나요? 전 이거 생각하는데 시간이 많이 걸렸네요 ㅠ


아래는 제가 짠 소스코드입니다. 초보라서... 푸는데만 집중했습니다.




  1 #include <stdio.h>

  2

  3 struct bytes {

  4     char b1;

  5     char b2;

  6     char b3;

  7     char b4;

  8 };

  9

 10 int main()

 11 {

 12     int cnt = 0, i = 0;

 13

 14     unsigned int before;

 15     unsigned int after;

 16

 17     struct bytes *pb = (struct  bytes*)&before;

 18     struct bytes *pa = (struct  bytes*)&after;

 19

 20     scanf("%d", &cnt);

 21

 22     for( i=0 ; i < cnt ; i++ )

 23     {

 24         scanf("%u", &before);

 25

 26         pa->b1 = pb->b4;

 27         pa->b2 = pb->b3;

 28         pa->b3 = pb->b2;

 29         pa->b4 = pb->b1;

 30

 31         printf("%u\n", after);

 32     }

 33     return 0;

 34

 35 }



소스에 대해 간단히 설명 드리겠습니다.



3~7라인 : 빅엔디안, 리틀엔디안 변환을 위한 구조체 입니다. char형 변수 4개로 구성되어 있습니다.


14~18라인 : 변환 전의 변수, 변환 후의 변수를 unsigned int로 만들었고, 그 변수의 주소값을 구조체 포인터변수에 넣었습니다.


26~27라인 : 빅엔디안, 리틀엔디안 변환을 위해서 char형 변수간의 교환을 하였습니다. 입력받은 정수의 뒤의 2바이트를 변환할 변수의 앞의 2바이트에 넣고, 입력받은 정수 앞의 2바이트를 변환할 변수 뒤의 2바이트에 넣었습니다.


 

 

 



끝입니다~ 생각보다 간단하죠?


그림으로 한번더 보여드릴게요.



위의 그림과 같이 되어 있습니다.


unsigned int는 4바이트 이기 때문에 이것을 1바이트씩 4개로 나누었고, 엔디안 변환을 위하여 각각의 4개의 1바이트 순서를 바꾸고, 그 바뀐 값을 unsigned int형으로 출력하였습니다.


포스팅하지 않은 문제도 있긴 하지만, 그런 문제들은 아직 포스팅할 수준이 아니었습니다.


제가 확실하게 풀고, 이해를 한 후, 이 카테고리의 포스팅을 하겠습니다.


알고스팟의 문제는 사람들마다 푸는 방법이 제각각입니다.


물론 비슷한 생각을 한 문제도 있지만, 결코 똑같을 수는 없습니다.


 

 



저도 시간이 오래 걸렸습니다. 여러분들도 꼭 스스로 풀어보시기 바랍니다.


도저히 못풀겠다 싶으면, 다른 사람들이 푼 것을 참고하시구요.


오늘 포스팅은 여기까지하겠습니다.


읽어주셔서 감사합니다.

728x90
반응형

'알고리즘 > 알고스팟' 카테고리의 다른 글

[알고스팟]ENDIAN (1)  (0) 2017.04.26