比较两个数a、b的大小,不能使用大于/小于、if、switch,?:等判断语句

本文介绍了在面试中遇到的一个问题,如何比较两个数的大小而不使用大于/小于、if、switch或条件运算符。通过位操作相减并观察符号位来实现。文章讨论了基础版本的位操作方法以及考虑溢出情况的改进版,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

今天面试碰到了这个问题,知道是位操作,不过当时没想起来,回来查了查总结一下。其实方法很简单,就是相减后看符号位,将减的结果的符号位移位到末尾,再和1与操作,或者直接和0x80000000与,得出的符号位再右移至末尾,作为数组的下标。int型占4字节,即32位,在-1为补码的机器上,1代表负数,0代表正数

int max(int x,int y)

{

int buf[2]={x,y};

unsigned int z;

        z=x-y;

        z=z>>31;//符号位移至末尾,作为数组下标

return buf[z];

}

上述代码是从网上查的,这是基础版本,但是未考虑内存溢出,如127-(-128)得出的结果超出了8位所能表示的数。并且上述版本不可直接用java写,java中没有无符号类型,因为java中右移运算补位是根据符号位,符号位为1就补1,符号位为0就补0,因此右移后可和1与操作。

下面的版本是考虑溢出,即判断两个数的符号相同否,相同的话就不会产生溢出。不相同的话,直接看符号位就ok了。下面上代码。

 

int max1(int x,int y){//符号相同,返回x,y中的大值
  unsigned int z;
  z=((x-y)>>31)&1;

  return (1-z)*x+z*y;//这种写法很巧妙
}

int max2(int x,int y){//符号不同,直接判断x的正负即可,返回最大值
  unsig
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值