Bit fields are partial size member variables inside a structure. Bit fields give flexibility to define some variables with less than the size or bit width of the original type. These are useful to save some numbers/parameters whose range is less than that of original type.

Let's take an example where we take a variable is_present of type Boolean. This can have only two values either true or false. Now considering the two possibilities we can say it can have a value of either 1 or zero which means only one bit is required to store this variable. Now if we use a Boolean or full size integer we are supposes to use only LSB and the rest 31 bits are unutilized. This can be optimized by defining a bit field of size 1 like "unsigned int is_present:1;"

```Syntax:
struct <struct name>  {
<type> <bit field name> : <bit width>;
...
};
Example:
struct bits_t  {
unsigned int  bits2 : 2;
unsigned int  bits3 : 3;
};
```

One point to note here is unsigned integer of 1 bit has a range 0 to1. But this is not same for signed integer. Signed integer takes signature bit in MSB and magnitude in LSB side. Thus 1 bit signed integer has a range -1 to 0. 2 bit signed integer has -1 to +1. Similarly 2 bit and 3 bit signed integer have ranges like -2 to +1 and -4 to +3 accordingly. Below tables show these all combination bit patterns and corresponding signed values.

1 bit signed integer

 Bit 0 Value 1 -1 0 0

2 bit signed integer

 Bit 1 Bit 0 Value 1 0 -2 1 1 -1 0 0 0 0 1 +1

3 bit signed integer

 Bit 2 Bit 1 Bit 0 Value 1 0 0 -4 1 0 1 -3 1 1 0 -2 1 1 1 -1 0 0 0 0 0 0 1 +1 0 1 0 +2 0 1 1 +3