Which is better option to use for dividing an integer number by 2?

前端 未结 23 1699
甜味超标
甜味超标 2020-11-27 09:10

Which of the following techniques is the best option for dividing an integer by 2 and why?

Technique 1:

x = x >> 1;

Technique

相关标签:
23条回答
  • 2020-11-27 09:38

    Take a look at the compiler output to help you decide. I ran this test on x86-64 with
    gcc (GCC) 4.2.1 20070719 [FreeBSD]

    Also see compiler outputs online at godbolt.

    What you see is the compiler does use a sarl (arithmetic right-shift) instruction in both cases, so it does recognize the similarity between the two expressions. If you use the divide, the compiler also needs to adjust for negative numbers. To do that it shifts the sign bit down to the lowest order bit, and adds that to the result. This fixes the off-by-one issue when shifting negative numbers, compared to what a divide would do.
    Since the divide case does 2 shifts, while the explicit shift case only does one, we can now explain some of the performance differences measured by other answers here.

    C code with assembly output:

    For divide, your input would be

    int div2signed(int a) {
      return a / 2;
    }
    

    and this compiles to

        movl    %edi, %eax
        shrl    $31, %eax
        addl    %edi, %eax
        sarl    %eax
        ret
    

    similarly for shift

    int shr2signed(int a) {
      return a >> 1;
    }
    

    with output:

        sarl    %edi
        movl    %edi, %eax
        ret
    
    0 讨论(0)
  • 2020-11-27 09:40

    Just an added note -

    x *= 0.5 will often be faster in some VM-based languages -- notably actionscript, as the variable won't have to be checked for divide by 0.

    0 讨论(0)
  • 2020-11-27 09:40

    Use x = x / 2; OR x /= 2; Because it is possible that a new programmer works on it in future. So it will be easier for him to find out what is going on in the line of code. Everyone may not be aware of such optimizations.

    0 讨论(0)
  • 2020-11-27 09:41

    Does the first one look like dividing? No. If you want to divide, use x / 2. Compiler can optimise it to use bit-shift if possible (it's called strength reduction), which makes it a useless micro-optimisation if you do it on your own.

    0 讨论(0)
  • 2020-11-27 09:44

    Knuth said:

    Premature optimization is the root of all evil.

    So I suggest to use x /= 2;

    This way the code is easy to understand and also I think that the optimization of this operation in that form, don't mean a big difference for the processor.

    0 讨论(0)
  • 2020-11-27 09:45

    As far as the CPU is concerned, bit-shift operations are faster than division operations. However, the compiler knows this and will optimize appropriately to the extent that it can, so you can code in the way that makes the most sense and rest easy knowing that your code is running efficiently. But remember that an unsigned int can (in some cases) be optimized better than an int for reasons previously pointed out. If you don't need signed arithmatic, then don't include the sign bit.

    0 讨论(0)
提交回复
热议问题