bit field
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

bit field

bit field´Â ÄÄÇ»ÅÍ °úÇп¡¼­ »ç¿ëÇÏ´Â ¿ë¾î·Î, µ¥ÀÌÅÍÀÇ ÃÖ¼Ò´ÜÀ§ÀÎ bit ¸¦ ÀÌ¿ëÇØ¼­ µ¥ÀÌÅ͸¦ °£´ÜÈ÷ ÀúÀåÇÏ´Â ¹æ¹ýÀ» Á¦½ÃÇÑ´Ù. ´ÜÀÏ ºñÆ® Áï, 0°ú 1À» »ç¿ëÇϱ⠶§¹®¿¡ on/offÀÇ »óÅÂÁ¤º¸¸¦ ÀúÀåÇϴµ¥ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. °¡Àå ³Î¸® »ç¿ëµÇ´Â ¿µ¿ªÀº flag¸¦ ÀÌ¿ëÇÑ »óÅÂÀúÀåÀÏ °ÍÀÌ´Ù.

C ¿¹Á¦

#include <stdio.h> 
 
#define STATUS_WATCHES_TV    (1 << 0) /* 0x01 */ 
#define STATUS_READS_BOOK    (1 << 1) /* 0x02 */ 
#define STATUS_PLAY_GAMES     (1 << 2) /* 0x04 */ 
#define STATUS_EAT_FOOD        (1 << 3) /* 0x08 */ 
 
unsigned int status; 
 
void setStatus(unsigned int flag) 
{ 
    status |= flag; 
} 
 
void resetStatus(unsigned char flag) 
{ 
    status &= ~flag; 
} 
 
unsigned int getStatus(unsigned int flag) 
{ 
    return (status & flag) != 0; 
} 
 
int main(int argc, char ** argv) 
{ 
  setStatus(STATUS_WATCHES_TV); 
  setStatus(STATUS_PLAY_GAMES); 
 
  if(getStatus(STATUS_WATCHES_TV)) 
  { 
    printf("I Watching TV\n"); 
  } 
  if(getStatus(STATUS_READS_BOOK)) 
  { 
    printf("I reading book\n"); 
  } 
  if(getStatus(STATUS_PLAY_GAMES)) 
  { 
    printf("I playing game\n"); 
  } 
  if(getStatus(STATUS_EAT_FOOD)) 
  { 
    printf("I eat food!\n"); 
  } 
} 
 
°¢°¢ÀÇ »óŰªÀ» À§Çؼ­ ÇϵåÄÚµùµÈ °ªÀ» »ç¿ëÇÏ´Â ´ë½Å¿¡, bit field¸¦ »ç¿ëÇϰí ÀÖ´Ù. °¢ Çʵ忡 °ªÀº shift ¿¬»êÀ» »ç¿ëÇϰí ÀÖÀ¸¹Ç·Î, bit ¿¬»êÀ» ÀÌ¿ëÇØ¼­ °£´ÜÈ÷ »óŸ¦ ¼³Á¤ÇÏ°í ¾ò¾î¿Ã ¼ö ÀÖ´Ù. °¡µ¶¼ºµµ ´ýÀ¸·Î ¾òÀ» ¼ö ÀÖ´Ù.

±¸Á¶Ã¼¿Í bit field

±¸Á¶Ã¼¿¡¼­ bit field°¡ »ç¿ëµÇ´Â °æ¿ì´Â ÈçÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. endian°ú °ü·ÃµÈ ¹®Á¦µé¶§¹®¿¡ °¡µ¶¼º°ú À¯Áöº¸¼ö¼ºÀÌ ¶³¾îÁú¼ö Àֱ⠶§¹®ÀÌ´Ù. Ä¿³ÎÀÇ °æ¿ì ³×Æ®¿öÅ© ÇÁ·ÎÅäÄÝ(TCP/IP¿Í °°Àº) ±¸Á¶Ã¼ Á¤ÀÇÇϱâ À§Çؼ­ ÀϺΠ»ç¿ëµÈ´Ù. ¾Æ·¡´Â tcp Çì´õ ±¸Á¶Ã¼ÀÌ´Ù. endian ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ #if¹®À» »ç¿ëÇϰí ÀÖ´Ù.
struct tcphdr 
{ 
    u_int16_t th_sport;     /* source port */ 
    u_int16_t th_dport;     /* destination port */ 
    tcp_seq th_seq;     /* sequence number */ 
    tcp_seq th_ack;     /* acknowledgement number */ 
#  if __BYTE_ORDER == __LITTLE_ENDIAN 
    u_int8_t th_x2:4;       /* (unused) */ 
    u_int8_t th_off:4;      /* data offset */ 
#  endif 
#  if __BYTE_ORDER == __BIG_ENDIAN 
    u_int8_t th_off:4;      /* data offset */ 
    u_int8_t th_x2:4;       /* (unused) */ 
#  endif 
    u_int8_t th_flags; 
#  define TH_FIN    0x01 
#  define TH_SYN    0x02 
#  define TH_RST    0x04 
#  define TH_PUSH   0x08 
#  define TH_ACK    0x10 
#  define TH_URG    0x20 
    u_int16_t th_win;       /* window */ 
    u_int16_t th_sum;       /* checksum */ 
    u_int16_t th_urp;       /* urgent pointer */ 
}; 
 

À§ÀÇ °æ¿ì´Â º¸±â°¡ Èûµå´Ï, Á»´õ ÀϹÝÀûÀÎ °æ¿ì¸¦ º¸ÀÚ.
#include <stdio.h> 
 
struct myStatus 
{ 
    unsigned int watch_tv:1; 
    unsigned int reads_book:1; 
    unsigned int play_book:1; 
    unsigned int eat_book:1; 
}; 
 
int main(int argc, char **argv) 
{ 
    struct myStatus mstatus; 
    mstatus.watch_tv = 1; 
    mstatus.reads_book = 1; 
    printf("Size of %ld\n",sizeof(struct myStatus)); 
 
    if(mstatus.watch_tv) 
    { 
        printf("I'm watch TV\n"); 
    } 
} 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.