我需要最有效的方法(在cpu循环中)来确定两个数字是否具有相同/不同的符号.但是,如果任一数字为零,我需要能够将其与具有相同/不同符号的数字区分开(即,零被视为“第三”).以下代码与我所需要的类似,但返回值只要只有三个不同的返回值即可.
int foo(int x,int y) { if (x * y > 0) return 1; if (x * y < 0) return -1; return 0; }
对于我的具体问题,值在[-6,6]范围内,X保证不为0.我找到一个解决方案来查找两个数字是否具有相同的符号,并更改它以获得以下解决方案.
return y? (((x^y) >= 0)? 1 : -1) : 0;
应该有一些bitops /比较,比使用乘法,分支,比较的结果更快.
解决方法
这是另一个版本(具有丑陋,非便携式位操作技巧):
int foo(int x,int y) { return ((x^y) >> 4) - ((x^(-y)) >> 4); }
一些解释:
>((x ^ y)> 4)如果x和y中的一个恰好为负,则为-1,否则为0.>((x ^( – y))>> 4)如果x和-y中的一个恰好为负,否则为0.>如果x> 0和y> 0,结果将为0 – (-1)= 1.>如果x < 0和y < 0,结果将为0 - (-1)= 1.>如果x> 0和y = 0,结果将为0 – 0 = 0.>如果x < 0和y = 0,结果将为(-1) - (-1)= 0.>如果x> 0和y < 0,结果将为(-1) - 0 = -1.>如果x < 0和y> 0,结果将为(-1) - 0 = -1. 假设二进制补码算术,并假定>>转移符号扩展.