Checking whether a number is positive or negative using bitwise operators

后端 未结 16 797
轮回少年
轮回少年 2020-12-08 20:01

I can check whether a number is odd/even using bitwise operators. Can I check whether a number is positive/zero/negative without using any conditional statements/operators l

相关标签:
16条回答
  • 2020-12-08 20:31
    #include<stdio.h>
    
    void main()
    {
        int n;  // assuming int to be 32 bit long
    
        //shift it right 31 times so that MSB comes to LSB's position
        //and then and it with 0x1
        if ((n>>31) & 0x1 == 1) {
            printf("negative number\n");
        } else {
            printf("positive number\n");
        }
    
        getch();
    }
    
    0 讨论(0)
  • 2020-12-08 20:31
    // if (x < 0) return -1
    // else if (x == 0) return 0
    // else return 1
    int sign(int x) {
      // x_is_not_zero = 0 if x is 0 else x_is_not_zero = 1
      int x_is_not_zero = (( x | (~x + 1)) >> 31) & 0x1;
      return (x & 0x01 << 31) >> 31 | x_is_not_zero; // for minux x, don't care the last operand 
    }
    

    Here's exactly what you waht!

    0 讨论(0)
  • 2020-12-08 20:36

    Or, you could use signbit() and the work's done for you.

    I'm assuming that under the hood, the math.h implementation is an efficient bitwise check (possibly solving your original goal).

    Reference: http://en.cppreference.com/w/cpp/numeric/math/signbit

    0 讨论(0)
  • 2020-12-08 20:37

    Here is an update related to C++11 for this old question. It is also worth considering std::signbit.

    On Compiler Explorer using gcc 7.3 64bit with -O3 optimization, this code

    bool s1(double d)
    {
        return d < 0.0;
    }
    

    generates

    s1(double):
      pxor xmm1, xmm1
      ucomisd xmm1, xmm0
      seta al
      ret
    

    And this code

    bool s2(double d)
    {
        return std::signbit(d);
    }
    

    generates

    s2(double):
      movmskpd eax, xmm0
      and eax, 1
      ret
    

    You would need to profile to ensure that there is any speed difference, but the signbit version does use 1 less opcode.

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