I've seen in a fair amount of Java code something like this:
int blah = ~someFunc() + 1;
instead of
int blah = -1 * someFunc();
is there any real difference in output here? Does javac recognize a difference between these two cases? It seems the compiler should be able to transform these two lines into the same byte code.
Edit: This is not about how bit flips work, it's a question about why an implementer might choose a certain approach to the operation.
Edit2: I did javap -c on a simple test and here's some JVM bytecode:
int one = -1 * someFunc();
0: iconst_m1
1: invokestatic #2 // Method someFunc:()I
4: imul
5: istore_1
int two = ~someFunc() + 1;
6: invokestatic #2 // Method someFunc:()I
9: iconst_m1
10: ixor
11: iconst_1
12: iadd
13: istore_2
So there are 3 more java instructions for the bit flip (which is iconst_m1, ixor
) plus one, but how that translates into machine cycles is probably very architecture-specific.
Speaking strictly of the instruction costs, the first approach could indeed be faster (on some processors): For example, visit http://www.agner.org/optimize/instruction_tables.pdf and compare cost of operations:
So, you might save one operation. On the other hand, each function call requires you to put vars on register stack and retrieve them from it, which adds additional cost.