c中的三向条件来确定两个数字的符号等价物

前端之家收集整理的这篇文章主要介绍了c中的三向条件来确定两个数字的符号等价物前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要最有效的方法(在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. 假设二进制补码算术,并假定>>转移符号扩展.

原文链接:https://www.f2er.com/c/112651.html

猜你在找的C&C++相关文章