加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:00:45 所属栏目:百科 来源:网络整理
导读:我需要最有效的方法(在cpu循环中)来确定两个数字是否具有相同/不同的符号.但是,如果任一数字为零,我需要能够将其与具有相同/不同符号的数字区分开(即,零被视为“第三”).以下代码与我所需要的类似,但返回值只要只有三个不同的返回值即可. int foo(int x,int
我需要最有效的方法(在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. 假设二进制补码算术,并假定>>转移符号扩展.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读