I’m someone who writes code just for fun and haven’t really delved into it in either an academic or professional setting, so stuff like these bitwise operators really escapes me.
I was reading an article about JavaScript, which apparently supports bitwise operations. I keep seeing this operation mentioned in places, and I’ve tried reading about to figure out what exactly it is, but I just don’t seem to get it at all. So what are they? Clear examples would be great! 😀
Just a few more questions – what are some practical applications of bitwise operations? When might you use them?
Since nobody has broached the subject of why these are useful:
I use bitwise operations a lot when working with flags. For example, if you want to pass a series of flags to an operation (say,
File.Open(), with Read mode and Write mode both enabled), you could pass them as a single value. This is accomplished by assigning each possible flag it’s own bit in a bitset (byte, short, int, or long). For example:So if you want to pass read AND write, you would pass (READ | WRITE) which then combines the two into
Which then can be decrypted on the other end like:
which checks
which returns
which is not 0, so the flag does specify READ.
You can use XOR to toggle various bits. I’ve used this when using a flag to specify directional inputs (Up, Down, Left, Right). For example, if a sprite is moving horizontally, and I want it to turn around:
I simply XOR the current value with (LEFT | RIGHT) which will turn LEFT off and RIGHT on, in this case.
Bit Shifting is useful in several cases.
is the same as
if you need to quickly multiply by a power of two, but watch out for shifting a 1-bit into the top bit – this makes the number negative unless it’s unsigned. It’s also useful when dealing with different sizes of data. For example, reading an integer from four bytes:
Assuming that A is the most-significant byte and D the least. It would end up as:
Colors are often stored this way (with the most significant byte either ignored or used as Alpha):
To find the values again, just shift the bits to the right until it’s at the bottom, then mask off the remaining higher-order bits:
0xFFis the same as11111111. So essentially, for Red, you would be doing this: