I’ve recently been writing some code for a research project that I’m working on, where efficiency is very important. I’ve been considering scraping some of the regular methods I do things in and using bitwise XORs instead. What I’m wondering is if this will make if a difference (if I’m performing this operation say several million times) or if it’s the same after I use 03 in g++.
The two examples that come to mind:
I had an instance where (I’m working with purely positive ints) I needed to change n to n-1 if n was odd or n to (n+1) if n was even. I figured I had a few options:
if(n%2) // or (n%2==0) and flip the order
n=n-1
else
n=n+1
or
n=n+2*n%2-1; //This of course was silly, but was the only non-bitwise 1 line I could come up with
Finally:
n=n^1;
All of the methods clearly do the same thing, but my feeling was that the third one would be the most efficient.
The next example is on a more general note. Say I’m comparing two positive integers, will one of these perform better than the others. Or will the difference really not be noticeable, even if I perform this operation several million times:
if(n_1==n_2)
if(! (n_1 ^ n_2) )
if( n_1 ^ n_2) else \do work here
Will the compiler just do the same operation in all of these instances? I’m just curious if there is an instance when I should use bitwise operations and not trust the compiler to do the work for me.
Fixed:In correct statement of problem.
It’s easy enough to check, just fire up your disassembler. Take a look:
f.c:
Build and disassemble:
It looks like
f1()is a bit shorter, whether or not that matters in reality is up to some benchmarking.