본문 바로가기

[무따기 C언어] 구조체와 공용체를 이용한 비트 연산.

반응형

   

변수 num에 저장되어 있는 0x02의 값.

   

bit1이 1인 경우와 0인 경우에 따라 다른 함수를 실행시키고 싶다면????

   

if ((num & 0x02) >> 1)

   

MachineEnable();

else

Machinesleep();

   

입력받는 num값이 0x02라면 AND연산을 실행해서 나오는 값이 0x00000010 이 되므로 그것을 옆으로 한칸 시프트 연산을 해주면 MachineEnable이 되는 것이다. 하지만 0x04가 들어가게 되면 AND 연산이 되는 부분이 없으로 0이되고 0을 옆으로 1비트 이동한다고 해도 0이 된다. 즉 MachineSleep 함수 호출이 된다.

   

C언어에서 비트 단위로 데이터를 나누어 사용하려면 먼저 구조체의 '힝목_이름' 옆에 ':'를 한 후에 숫자를 적어주면 해당 항목은 그 만큼의 비트 수를 갖는다.

   

struct _bit{

unsigned char B0 : 1;

unsigned char B1 : 1;

unsigned char B2 : 1;

unsigned char B3 : 1;

unsigned char B4 : 1;

unsigned char B5 : 1;

unsigned char B6 : 1;

unsigned char B7 : 1;

}bit;

   

구조체 bit의 항목 B0부터 B7까지는 모두 1비트씩의 공간을 갖게 되는 것.

   

위와 같은 경우에는 if문을 다음과 같이 사용할 수 있다.

   

if(bit.B1 ==1 )

MachineEnable();

else

MachineSleep();

   

   

   

   

#include <stdio.h>

   

typedef union _BYTE

{

  unsigned char byte;  //공용체에서 변수 byte 밑의 구조체 bit 같은 메로리를 사용.

  struct _bit

  {

    unsigned char B0 : 1;

    unsigned char B1 : 1;

    unsigned char B2 : 1;

    unsigned char B3 : 1;

    unsigned char B4 : 1;

    unsigned char B5 : 1;

    unsigned char B6 : 1;

    unsigned char B7 : 1;

  } bit;

}BYTE;

   

int main()

{

  BYTE data;

   

  printf("0부터 255까지의 값을 입력해보세요.\n");

  printf("입력한 10진수 값을 2진수로 바꾸어서 출력합니다.\n");

  printf("[10진수] :");

  scanf("%d"&data.byte);  //공용체이므로 byte 저장되도 구조체 bit 저장되는 .

   

  printf("입력한 10진수 값을 2진수로 변경하면 다음과 같습니다.\n");

  printf("%d", data.bit.B7);

  printf("%d", data.bit.B6);

  printf("%d", data.bit.B5);

  printf("%d", data.bit.B4);

  printf("%d", data.bit.B3);

  printf("%d", data.bit.B2);

  printf("%d", data.bit.B1);

  printf("%d", data.bit.B0);

  printf("\n");

   

}

   

   

   

공용체는 두 개 이상의 자료형이 같은 메모리 공간을 사용하므로 바이트와 비트연산과 같은 기능을 구현하기에 적합하다.

반응형
-->