Bitwise operators can be used to perform bit level operation on variables. Below is a list of all six bitwise operators supported in C:
& bitwise AND
| bitwise inclusive OR
^ bitwise exclusive OR (XOR)
~ bitwise not (one's complement)
<< logical left shift
>> logical right shift
Following program illustrates the use of all bitwise operators:
unsigned int a = 29; /* 29 = 0001 1101 */ unsigned int b = 48; /* 48 = 0011 0000 */ int c = 0;
c = a & b; /* 32 = 0001 0000 */ printf("%d & %d = %d\n", a, b, c );
c = a | b; /* 61 = 0011 1101 */ printf("%d | %d = %d\n", a, b, c );
c = a ^ b; /* 45 = 0010 1101 */ printf("%d ^ %d = %d\n", a, b, c );
c = ~a; /* -30 = 1110 0010 */ printf("~%d = %d\n", a, c );
c = a << 2; /* 116 = 0111 0100 */ printf("%d << 2 = %d\n", a, c );
c = a >> 2; /* 7 = 0000 0111 */ printf("%d >> 2 = %d\n", a, c );
return 0; }
Bitwise operations with signed types should be avoided because the sign bit of such a bit representation has a particular meaning. Particular restrictions apply to the shift operators:
- Left shifting a 1 bit into the signed bit is erroneous and leads to undeﬁned behavior.
- Right shifting a negative value (with sign bit 1) is implementation deﬁned and therefore not portable.
- If the value of the right operand of a shift operator is negative or is greater than or equal to the width of the promoted left operand, the behavior is undeﬁned.
Masking refers to the process of extracting the desired bits from (or transforming the desired bits in) a variable by using logical bitwise operations. The operand (a constant or variable) that is used to perform masking is called a mask.
Masking is used in many diﬀerent ways:
- To decide the bit pattern of an integer variable.
- To copy a portion of a given bit pattern to a new variable, while the remainder of the new variable is ﬁlled with 0s (using bitwise AND)
- To copy a portion of a given bit pattern to a new variable, while the remainder of the new variable is ﬁlled with 1s (using bitwise OR).
- To copy a portion of a given bit pattern to a new variable, while the remainder of the original bit pattern is inverted within the new variable (using bitwise exclusive OR).
void bit_pattern(int u)
int i, x, word;
unsigned mask = 1;
word = CHAR_BIT * sizeof(int);
mask = mask << (word - 1); /* shift 1 to the leftmost position */
for(i = 1; i <= word; i++)
x = (u & mask) ? 1 : 0; /* identify the bit */
printf("%d", x); /* print bit value */
mask >>= 1; /* shift mask to the right by 1 bit */