What are bitwise operations?Bitwise operations modify the pattern of bits in an object. To understand bitwise operations, it is necessar
y to have some background in binary numbers. A binary number consists of ones and zeros, which can, in the case of computers, represent two different states, such as on/off. For our purposes, though, it is best to think of it as merely a different way of
writing a "normal" base ten number. In base ten, each of the digits in a number represents a power of ten. Let's use the number 432 as an example. The 2 represents the number of 10^0 (ones) there are in the number. Likewise, the 3 represents
the number of 10^1 (tens) and the 4 represents the number of 10^2 (hundreds). Hence the number is actually 4*100 + 3*10 + 2*1.
Binary numbers, of course, work in exactly the same way. In the number 111, there is one 2^0 (one), one 2^
1 (two), and one 2^2 (four). The number is a binary version of the base ten number 7 (4+2+1).
This brings us to the use of binary numbers in graphics programming. One of the most common uses of binary numbers is in defining colors in a colormaps. The color red, for example, could be defined in 24-bit color as 111111110000000000000000. This color has three areas or fields, which represent the red, green, and blue values for the color. The first eight bits are for the red, and when translated into a base ten number, they equal 255, which is the maximum value for any one color.
How are they used?It is in this contex
t that bitwise operations become truly useful. Many simple image processing can be done by simple use of bitwise operators. To extract one of the color channels (such as red, green, or blue) from an image, one can use a bitmask and the bitwise "and" opera
tor. In C++, which is the language these tutorials focus on, the bitwise and is a single "&." When two bits are compared using the and operator, a one is returned if both are one, and a zero is returned in all other cases. In the same
fashion, we can and sets of bits. If we use the bitmask 111111110000000000000000, which represents red, and and it with each of the other pixels in the image one at a time, only the red values will remain. Presto: we've just separate
d the image into its red component!!!
So, what are other bitwise operators?Well, there are a few more... actually, there are a lot more. Related to the and operator, there is the or operator, which returns one if either or both of th
e bits it is comparing are one and zero otherwise, and the xor (exclusive-or) operator, which is similar to or except that it returns a zero if both arguments are one. There is also the not operator, which inverts the bit and yields a zero i
f it is one and a one if it is zero.
There are also so-called bitshift operators, which move the bits around inside the number. For example, a left bitshift "rotates" the number so that the leftmost bit becomes the rightmost bit. A single left shift of the binary number 10011010, for
example, yields 00110101. A right shift does the reverse. There are also variations in which the space to the right of the number is truncated (for a right shift), or zero-filled (in the case of a left shift). In C++, the bitshift operators are
<< for a left shift (zero filling) and >> for a right shift (zero filling on the left).
Return to the main page