2015-06-02 3 views
2

Мне нужно обновить следующую структуру, чтобы добавить уличную информацию в структуру.Добавление дополнительных бит в поле бит c

typedef struct address_tag { 
    union { 
     struct { 
      unsigned state : 20;  
      unsigned city : 10; 
      unsigned unused :2; 
     }; 

     uint32_t address; 
    }; 

} defect_address_t; 

Я использовал неиспользуемые биты и используются 2 бита для улицы:

typedef struct address_tag { 
    union { 
     struct { 
      unsigned state : 20;  
      unsigned city : 10; 
      unsigned street :2; 
     }; 

     uint32_t address; 
    }; 

}address_t; 

Проблема в том, что я должен зарезервировать 10 бит для улицы вместо 2. Есть ли способ, я могу добавить это сделать ? Я должен убедиться, что адрес 32 бита.

+4

20 + 10 + 10 = 40. не может это сделать, если вы не потеряете бит из другого места или не увеличите допустимый размер ... –

+5

Зачем вам нужно 20 бит для определения состояния? Это более 1 миллиона возможностей. –

+1

Итак, вы предполагаете, что в городе есть не более 1024 улиц? Я не говорю, что вы не должны (и я не знаю, сколько улиц может иметь город), но предположение должно быть явным. –

ответ

0

Очевидным решением является получение некоторых бит от других, таких как state. Если вы только для США, вам нужно не более 6 бит для состояния. Во всяком случае, вам, вероятно, понадобятся некоторые бит из состояния в поле города.

Однако, если ваша единственная проблема - память (занимающая не более 32 бит), вы можете просто добавить все возможности к enum и иметь функции, которые извлекают состояние/город/улицу.

typedef enum state_city_street_t 
{ 
    CALIFORNIA, 
    CALIFORNIA_SANFRANCISCO = CALIFORNIA, 
    CALIFORNIA_SANFRANCISCO_MISSIONSTREET = CALIFORNIA_SANFRANCISCO, 
    CALIFORNIA_SANFRANCISCO_HOWARDSTREET, 
    CALIFORNIA_SANFRANCISCO_END, 
    CALIFORNIA_MOUNTAINVIEW = CALIFORNIA_SANFRANCISCO_END, 
    CALIFORNIA_MOUNTAINVIEW_CASTROSTREET = CALIFORNIA_MOUNTAINVIEW, 
    ... 
    CALIFORNIA_END, 
    NEVADA = CALIFORNIA_END, 
    NEVADA_LASVEGAS = NEVADA, 
    NEVADA_LASVEGAS_THESTRIP = NEVADA_LASVEGAS, 
    ... 
} state_city_street_t; 

#define GET_CONST(state, city, street) state##_##city##_##street 
#define IS_STATE(value, state) ((value >= state) && (value < state##_END)) 

Это гарантирует наилучшее использование памяти (никакая комбинация бит не используется). Основным компромиссом является более жесткий доступ к отдельным полям, как с точки зрения производительности, так и с ясностью кода. В идеале, перечисление будет автогенерировано.