检查两个整数是否具有相同符号的最简单方法是什么?

77

判断两个整数是否同号的最简单方法是什么?是否有一种简短的按位运算技巧可以实现此功能?

19个回答

1

无分支的 C 版本:

int sameSign(int a, int b) {
    return ~(a^b) & (1<<(sizeof(int)*8-1));
}

C++ 整数类型的模板:

template <typename T> T sameSign(T a, T b) {
    return ~(a^b) & (1<<(sizeof(T)*8-1));
}

1

就我个人的想法...

int mask = 1 << 31;
(a & mask) ^ (b & mask) < 0;

只适用于32位整数,这在问题中没有规定。 - Larry Gritz

1

对于使用二进制补码算术的任何大小的整数:

#define SIGNBIT (~((unsigned int)-1 >> 1))
if ((x & SIGNBIT) == (y & SIGNBIT))
    // signs are the same

1

如果 (a*b < 0) 则符号不同,否则符号相同(或者 a 或 b 为零)


1

假设是32位

if(((x^y) & 0x80000000) == 0)

...答案if(x*y>0)由于溢出而不好


0
#include<stdio.h>

int checksign(int a, int b)
{
 return (a ^ b); 
}

void  main()
{
    int a=-1, b = 0;

    if(checksign(a,b)<0)
    {
        printf("Integers have the opposite sign");
    }
    else
    {
        printf("Integers have the same sign");
    }
}

0
更好的方法是使用 std::signbit 如下所示:
std::signbit(firstNumber) == std::signbit(secondNumber);

它还支持其他基本类型(doublefloatchar等)。

0
回想起我的大学时光,在大多数机器表示中,整数的最左边位不是在数字为负数时为1,在数字为正数时为0吗?
虽然我想这可能与机器有关。

0

int same_sign = !( (x >> 31) ^ (y >> 31) );

如果 same_sign 为真,则... 否则...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接