DiemazzSangakBolshevik revolution Tiny Tank WTIQ amal maahad KXWA Kentaro Ito Khabarovsk War Crimes Trials Hengshui Visigoths File:Changde battle jpg ZNF346 Billy Abercromby Bounce address Mozenrath Birger Gregersson Erosion Bishop of Crediton WTAA gone shopping Ea (digraph) Rich and Strange Zhengzhou Commodity Exchange Delta Air Lines Northwest Airlines merger Moritz Güdemann Yang Zaisi Salirophila Hainanese dialect Mykolaiv Xianbei KIRN Nokia 7700 born c Campo Lindo Zoophobia PentMinor mid Cosmography Symmes Purchase Georgian Legion Evergreen (disambiguation) WQSS Salah Shahade Ili Kazakh Autonomous Prefecture Flange William Temple Hornaday Bugchasing and giftgiving cg shrines Zhongbei Linda Cohn wbbm 780 WZSP WIOD CinemaNow |
A bit field is a common idiom used in computer programming to store a set of Boolean datatype flags compactly, as a series of bits. The bit field is stored in an integral type of known, fixed bit-width. Each Boolean flag is stored in a separate bit. Usually the source code will define a set of constants, each a power of two, that semantically associate each individual bit with its respective Boolean flag. The bitwise operators and, or, and not are used in combination to set, reset and test the flags. A bit field is distinguished from a bit array in that the latter is used to store a large set of bits indexed by integers and is often wider than any integral type supported by the language. Bit fields, on the other hand, typically fit within a machine word, and the denotation of bits is independent of their numerical index. Nevertheless, a bit field can be safely and elegantly implemented using a bit array where the bit indices for each flag are values of an enumerated type (like the ExamplesExample implementation in C: #define PREFERENCE_LIKES_ICE_CREAM ((unsigned char) (1 << 0)) // 0x01 #define PREFERENCE_PLAYS_GOLF ((unsigned char) (1 << 1)) // 0x02 #define PREFERENCE_WATCHES_TV ((unsigned char) (1 << 2)) // 0x04 #define PREFERENCE_READS_BOOKS ((unsigned char) (1 << 3)) // 0x08 unsigned char preference; void set_preference(unsigned char flag) { preference |= flag; } void reset_preference(unsigned char flag) { preference &= ~flag; } unsigned char get_preference(unsigned char flag) { return (preference & flag) != 0; } Instead of using hardcoded numerical representations for the powers of two ( Kernighan and Ritchie's book, The C Programming Language, describes a method for defining and accessing fields directly. Using this method, bitwise operators are not needed as bit members can be accessed the same as struct members. An example using a struct preferences { unsigned int likes_ice_cream : 1; unsigned int plays_golf : 1; unsigned int watches_tv : 1; unsigned int reads_books : 1; }; struct preferences fred; fred.likes_ice_cream = 1; fred.plays_golf = 1; fred.watches_tv = 1; fred.reads_books = 0; if (fred.likes_ice_cream == 1) /* ... */ However, bit members in structs have practical drawbacks. First, the ordering of bits in memory is architecture dependent and memory padding rules varies from compiler to compiler. In addition, many popular compilers generate inefficient code for reading and writing bit members, and there are potentially severe thread safety issues relating to bit fields (especially on multiprocessor systems) due to the fact that most machines cannot manipulate arbitrary sets of bits in memory, but must instead load and store whole words. e.g. the following would not be thread-safe, in spite of the use of a mutex:[clarification needed] struct foo { int flag : 1; int counter : 15; }; struct foo my_foo; /* ... */ pthread_mutex_lock(&my_mutex); my_foo.flag = !my_foo.flag; pthread_mutex_unlock(&my_mutex); as on most machines it is impossible at the hardware level to load and store See alsoExternal links
|
Site Map: RSS 2.0
Recent Searches:
Bitfield
Related Pages: |