位运算判断两个数是否异号

首先介绍下负数在计算机中的表示和存储

在计算机系统中,数值一律用补码表示和存储。含符号位和数值位,符号位:0表示“正”; 1表示“负”。
正数的补码 = 原码
负数的补码 = 负数的原码取反(符号位保持不变)+ 1
列如
比如 -7 补=11111001(八位二进制) :
原码:(符号位不变) 10000111
反码:(符号位不变) 11111000
(符号位不变)加1得补码:11111001
为什么要使用补码的形式呢?
例如在减法运算中,可以看作是正数和负数的加法操作,使用补码的形式表示数值,我们就可以直接将x-y表示为 x + (-y)的处理过程

问题:写一个函数,判断给定的两个数字是否是符号相反的,不可以使用比较运算符。

例如 fun(-1, 100) == true; fun(5,6)=false; fun(-1,-2)=false; 同时,规定0属于正数。
在二进制表示中,最高位是1的话,就是负数。最高位为0则为正数。
因此我可以想办法通过位运算来判断。1 ^ 0 = 1。所以 负数^正数=负数。其实就是类似于乘法了。


bool oppositeSigns(int x, int y)
{
    return ((x ^ y) < 0);
}
 
int main()
{
    int x = 100, y = -100;
    if (oppositeSigns(x, y) == true)
       printf ("Signs are opposite");
    else
      printf ("Signs are not opposite");
    return 0;
}
int x = -1, y = 2;
bool f = ((x ^ y) < 0); // true    ⇒ 1 ^ 0 ==  1   < 0   // 负数小于 0  异号

int x = 3, y = 2;
bool f = ((x ^ y) < 0); // false   => 0 ^ 0 == 0 // 0 为正数   同号

但是,这里用到了比较运算符。其实完全可以把 <0 的比较去掉,因为我们只需要知道第一位符号位即可。

bool oppositeSigns(int x, int y)
{
    return ((x ^ y) >> 31);
}

右移31位,则只剩下最高位符号位,不是0,就是1。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值