Should I bit-shift to divide by 2 in Java?
Solution 1
Unless you're working in a shop and a codebase where bit-shifting is common then, IMHO, you're risking obfuscation. Yes, the expressions may be logically equivalent but:
- A n00b might get confused by the alternate syntax
- An old guy who hasn't had to do any bit-shifting since college, like myself, might get confused
- If you bit shift and feel the need to comment on what you just did then you're definitely off. Simple division is self-documenting and would be clear to anyone who's familiar with elementary math
- You're not going to outsmart a compiler for optimization on something that simple so don't bother trying
- As good coding practice it's better to make your code simple/vanilla rather than clever(er)
All this is relative and, again, really depends on your shop's standards. If your colleagues love to bit-shift, then by all means go forth and bit-shift.
Solution 2
Yes, this is the very first thing that anyone attempting to do compiler optimizations will do (and has done for at least 5 decades), it most certainly is done by the Java JIT compiler, and you'd probably have a very hard time finding any compiler that doesn't do it.
And even if they didn't, it would still be a premature micro-optimization that should be avoided in favor of having the code be clearer.
Solution 3
Modern compilers are clever enough to generate the fastest code for divisions by two. They'll do a shift if it is faster. If what you want to achieve is a division by 2, using a division will make your code clearer. And you'll avoid problems when the number to be divided is negative.
Solution 4
The division routine for your CPU will handle this. There is no need for you to do it.
This is known as a premature optimization.
Matt Huggins
Currently developing with Ruby (Rails) and Javascript (React/Redux). Variety of past & present experience includes mobile development (React Native, Android, Cordova), SQL, Java, PHP, C/C++, etc.
Updated on October 19, 2020Comments
-
Matt Huggins over 3 years
Possible Duplicates:
Is shifting bits faster than multiplying and dividing in Java? .NET?
Quick Java Optimization QuestionMany years ago in college, I learned that bit-shifting right by one accomplishes the same thing as dividing by two, but is generally significantly faster. I'm not sure how Java has come along in that regards since the 9-10 years ago I learned about that. Does the Java compiler automatically converts a divide-by-two into a bit-shift operation, or should I manually perform the bit-shift operation in the code myself?