views:

378

answers:

10

I must say I have never had cause to use bitwise operators, but I am sure there are some operations that I have performed that would have been more efficiently done with them. How have "shifting" and "OR-ing" helped you solve a problem more efficiently?

A: 

Check out this links. It's for actionscript but bitwise operators are pretty much the same as in other languages: bitwise gems fast integer math

sharvey
+1  A: 

1) Divide/Multiply by a power of 2

foo >>= x; (divide by power of 2)

foo <<= x; (multiply by power of 2)

2) Swap

x ^= y;
y = x ^ y;
x ^= y;
Taylor Leese
It'd be interesting to see benchmarks demonstrating whether those are actually faster than the normal way on modern compilers.
sepp2k
I'd be pretty confident the shift is faster. The swap is more about not needing additional memory than being faster.
Taylor Leese
@Taylor: Most modern compilers will use a shift when it's the fastest way, without you having to manually code it.
Ken White
+2  A: 

I have not read the book (yet), but I have been told that the Book Hacker's Delight shows a number of tricks in working with bits.

Kevin
+1  A: 

While multiplying/dividing by shifting seems nifty, the only thing I needed once in a while was compressing booleans into bits. For that you need bitwise AND/OR, and probably bit shifting/inversion.

sbi
+1  A: 

You can compress data, e.g. a collection of integers:

  • See which integer values appear more frequently in the collection
  • Use short bit-sequences to represent the values which appear more frequently (and longer bit-sequences to represent the values which appear less frequently)
  • Concatenate the bits-sequences: so for example, the first 3 bits in the resulting bit stream might represent one integer, then the next 9 bits another integer, etc.
ChrisW
A: 

I used bitwise operators to efficiently implement distance calculations for bitstrings. In my application bitstrings were used to represent positions in a discretised space (an octree, if you're interested, encoded with Morton ordering). The distance calculations were needed to know whether points on the grid fell within a particular radius.

ire_and_curses
+1  A: 

Counting set bits, finding lowest/highest set bit, finding nth-from-top/bottom set bit and others can be useful, and it's worth looking at the bit-twiddling hacks site.

That said, this kind of thing isn't day-to-day important. Useful to have a library, but even then the most common uses are indirect (e.g. using a bitset container). Also, ideally, these would be standard library functions - a lot of them are better handled using specialise CPU instructions on some platforms.

Steve314
+6  A: 

See the famous Bit Twiddling Hacks
Most of the multiply/divide ones are unnecessary - the compiler will do that automatically and you will just confuse people.

But there are a bunch of, 'check/set/toggle bit N' type hacks that are very useful if you work with hardware or communications protocols.

Martin Beckett
A: 

I wanted a function to round numbers to the next highest power of two, so I visited the Bit Twiddling website that's been brought up several times and came up with this:

i--;
i |= i >> 1;
i |= i >> 2;
i |= i >> 4;
i |= i >> 8;
i |= i >> 16;
i++;

I use it on a size_t type. It probably won't play well on signed types. If you're worried about portability to platforms with different sized types, sprinkle your code with #if SIZE_MAX >= (number) directives in appropriate places.

Chris Lutz
A: 

There's only three that I've ever used with any frequency:

  1. Set a bit: a |= 1 << bit;

  2. Clear a bit: a &= ~(1 << bit);

  3. Test that a bit is set: a & (1 << bit);

Scott