不使用比较运算符如何比较两个数的大小

分享一波:程序员赚外快-必看的巅峰干货

前言

今天在水群的过程中看到有位群员谈论到这个话题,是他找工作过程中某家公司的面试题(到底是哪家公司才会出这种没营养的题目刁难别人),有点兴趣,就开始写了。
开搞

想了一下,其实就是题目怪了一点,难度其实并不高。这个题目让我想起了前两年看到的题目,只给你加法,怎么计算加减乘除(都说了到底是哪家公司才会出这种没营养的题目)。相比起来,这题好歹是考了计算机中的加法器,而本文主题中谈论的题目则真的是毫无营养。

思路其实很明显,位运算,这类题目一般都是要用位运算的。这里需要使用到无符号右移。

首先,既然不允许直接比较,那我就相减嘛,a-b结果是0就是相等,结果是负数就是a小,结果是正数那就是a大。

当然这里是不能直接比较结果的正负的, 这样依然不符合提议,怎么办呢。

一切的运算在计算机中都是二进制,数字也是用二进制表示的,而二进制表示数字的时候,最高位是代表符号位,1是负数,0是正数,传统的int最高32位。因此我们只需要判断第32位的结果是0还是1就能判断谁大谁小。直接判断第32位肯定不现实,这里就需要使用到无符号右移运算符“>>>”。举个简单的例子,下面这串二进制只需要无符号右移31位,就可以得到最高位的值

1000 0010 1101 0100 1101 0001 0010 0011
无符号右移31位后
0000 0000 0000 0000 0000 0000 0000 0001

结果显而易见,最高位降到了最低位,其余位全部变成了0,因此,只要结果是负数,那么进行 >>>31 之后的结果转为十进制就是1,否则为0。

    int a = 10;int b = 12;int index = (a - b) >>> 31;

这样,我们只需要判断index即可。

那么问题来了,题目要求是不允许判断,该怎么办呢?其实这里可以使用数组,下标为0的地方输出a>=b,为1的地方输出a<b。

完整代码:

public void test() {int a = 10;int b = 12;int index = (a - b) >>> 31;String[] arr = {"a>=b", "a<b"};System.out.println(arr[index]);
}

至此,已经基本可以判断a和b的大小了。但是到这里可以发现,a=b和a>b的情况无法分离,这里我们可以继续思考。

当a=b时,a-b=0,那么数组0下标位置是否可以直接放a=b?接着,我们把上面的index+1,结果就变成了:1下标位置是大于等于,2下标位置是小于。其中,等于的情况已经在0下标位置,因此1下标位置的结果就是a>b了。

String[] arr = {“a=b”, “a>b”, “a<b”};

分析到这里,思路已经很清晰,首先我们计算a-b,直接作为下标取arr中的数据,如果报错了,说明不是0、1、2的情况,那么就继续按照上面的思路进行位运算,取出1和2下标的值 。

public void test() {int a = 13;int b = 12;int diff = a - b;String[] arr = {"a=b", "a>b", "a<b"};try {System.out.println(arr[diff]);} catch (ArrayIndexOutOfBoundsException e) {int index = diff >>> 31;System.out.println(arr[index + 1]);}
}

到了这里,程序还存在一个bug,当a-b=2时,该程序的判断结果是有问题的,因此,我们需要把计算结果为2的情况给排除,做法很简单,把diff这个变量进行有符号左移2位的操作即可(如果只移1位,当diff为1时,计算结果是2,不符合题意)。左移2位之后的结果绝对值肯定比2要大,因此也就杜绝了出现下标为2的情况。

最终代码。

public void test() {
int a = 14;
int b = 12;
int diff = (a - b) << 2;
String[] arr = {“a=b”, “a>b”, “a<b”};
try {
System.out.println(arr[diff]);
} catch (ArrayIndexOutOfBoundsException e) {
int index = diff >>> 31;
System.out.println(arr[index + 1]);
}
}

最后还是要吐槽一句,没事别出这种没营养的面试题刁难人家啦!

*************************************优雅的分割线 **********************************

分享一波:程序员赚外快-必看的巅峰干货

如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程

请关注微信公众号:HB荷包
在这里插入图片描述
一个能让你学习技术和赚钱方法的公众号,持续更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java占位符填充_Java使用freemark生成word

1、制作模板先用office word做一个模板word文档&#xff0c;${usrName}、${nowDate}占位符 可以使用 office 或者 wps 先创建一个模板表格 &#xff08;替换$部分可以在 模板格式改变之后 在替换xml 格式改了后有些原本的字符会分开&#xff09;2、用office word将模板word另存…

Java中如何使用非阻塞异步编程——CompletableFuture

分享一波:程序员赚外快-必看的巅峰干货 对于Node开发者来说&#xff0c;非阻塞异步编程是他们引以为傲的地方。而在JDK8中&#xff0c;也引入了非阻塞异步编程的概念。所谓非阻塞异步编程&#xff0c;就是一种不需要等待返回结果的多线程的回调方法的封装。使用非阻塞异步编程…

城市运行一网统管_【宣传活动】持续开展城市运行“一网统管”建设宣传活动...

为进一步推进本镇城市运行“一网统管”建设工作&#xff0c;提高城市治理能力和治理水平&#xff0c;提升社会各界的知晓度和参与度&#xff0c;激发职能部门人员、党员、群众参与“一网统管”工作的热情。9月10日&#xff0c;镇网格中心于福泉居委会议室开展“推进城市运行‘一…

Java如何只使用位运算实现加减乘除

分享一波:程序员赚外快-必看的巅峰干货 前言 接前面一篇博客&#xff0c;这又是某个公司的奇葩面试题&#xff08;都说了到底是哪家公司才会出这种没营养的面试题&#xff09;。不过吐槽归吐槽&#xff0c;这个题目还是有点学问的&#xff0c;比前面那个 不使用比较运算符如何…

pmc订单表格_复工了,读一则“如何提升订单准交率和生产效率”的真实故事

故事发生在中国南方小镇上一个做办公家具的公司……家具公司创建于1995年&#xff0c;是一家集研发、生产、销售、服务为一体的现代办公家具、酒店家具制造企业。主要产品有实木班台系列、会议台系列、职员桌系列、屏风系列、沙发系列、办公座椅、酒店家具系列。在省外还有两个…

GET和POST请求到底有什么区别?

分享一波:程序员赚外快-必看的巅峰干货 看到这个标题&#xff0c;想必大部分人都已经想关掉这篇博客了。先别急&#xff0c;你真的知道这两个的区别吗&#xff1f; 做过WEB开发的朋友可能很熟悉&#xff0c;看到这个问题能立马脱口而出二者的区别。 GET在浏览器回退时是无害的…

有赞电商云应用框架设计

背景 有赞是 SaaS 公司&#xff0c;向商家提供了全方位的软件服务&#xff0c;支撑商家进行采购、店铺、商品、营销、订单、物流等等管理服务。 在这个软件服务里&#xff0c;能够满足大部分的商家&#xff0c;为商家保驾护航。 但是很多大商家往往会有自己的特殊需求&#xff…

vivado 如何创建工程模式_基于Vivado的FPGA高性能开发研修班2019年8月30日上海举行...

一、课程介绍&#xff1a;从7系列FPGA开始&#xff0c;Xilinx提出了Vivado Design Suite设计软件&#xff0c;提供全新构建的SoC 增强型、以 IP 和系统为中心的下一代开发环境&#xff0c;以解决系统级集成和实现的生产力瓶颈。同时&#xff0c;Xilinx专门针对Vivado推出了Ultr…

程序员的自我修养——远离“外包思维”

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 在我们做开发的日子里&#xff0c;不免会进行跳槽&#xff0c;跳来跳去公司无非就分成两大类——互联网公司、外包公司。当然我们本次讨论的并…

英特尔为 Kubernetes 推出分布式深度学习平台:Nauta

2019独角兽企业重金招聘Python工程师标准>>> 随着人工智能的发展&#xff0c;深度学习的价值不断增长&#xff0c;但实现它可能是一个复杂耗时的过程。英特尔(Intel)正寻求通过其在 Kubernetes 进行分布式深度学习的新开源平台来改变这一状况&#xff0c;该深度学习…

pytorch梯度下降函数_Pytorch中常用的四种优化器SGD、Momentum、RMSProp、Adam

来源&#xff1a;AINLPer微信公众号编辑: ShuYini校稿: ShuYini时间: 2019-8-16 引言很多人在使用pytorch的时候都会遇到优化器选择的问题&#xff0c;今天就给大家介绍对比一下pytorch中常用的四种优化器。SGD、Momentum、RMSProp、Adam。随机梯度下降法&#xff08;SGD&#…

python计算无穷级数求和常用公式_傅里叶变换(二) 从傅里叶级数到傅里叶变换...

在上一部分当中&#xff0c;得到了利用三角函数表示周期函数的方法&#xff0c;但是对于非周期函数就...凉了。所以有什么办法吗&#xff1f;没办法&#xff08;划掉&#xff09;。这时候我们就需要拿出来我们的黑科技——傅里叶变换。一、傅里叶级数的推广当然这东西肯定不是凭…

中鸣投篮机器人怎么组装_1000余人参加洛阳市青少年机器人竞赛

机器人智能识别地面上的黑色线条&#xff0c;并沿着线条来到指定位置&#xff0c;放下“快递包裹”&#xff1b;无人机在空中飞舞&#xff0c;时而钻过圆环&#xff0c;时而来个空翻&#xff0c;犹如跳芭蕾般在空中划过一道优美曲线&#xff1b;橘红色乒乓球从筒道中送出&#…

Exchange队列优先级介绍和配置

一、场景 在日常办公环境中所有邮件都会存在重要与非重要的情况&#xff0c;并且不同的邮箱的使用人的级别也不一样&#xff0c;不一样的职位级别要求不一样的运维等级&#xff0c;以及发送邮件要求的速度也不一样。这就导致了邮件需要按照重要性进行分类&#xff0c;重要的邮件…

Mybatis源码阅读(一):Mybatis初始化1.3 —— 解析sql片段和sql节点

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

添加请求头 retrofit_RxJava 与 Retrofit 结合的最佳实践

前言RxJava和Retrofit也火了一段时间了&#xff0c;不过最近一直在学习ReactNative和Node相关的姿势&#xff0c;一直没有时间研究这些新东西&#xff0c;最近有个项目准备写&#xff0c;打算先用Android写一个Demo出来&#xff0c;却发现Android的世界发生了天翻地覆的变化&am…

Mybatis源码阅读(二):动态节点解析2.1 —— SqlSource和SqlNode

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

k8s边缘节点_边缘计算,如何啃下集群管理这块硬骨头?

导读边缘计算平台&#xff0c;旨在将边缘端靠近数据源的计算单元纳入到中心云&#xff0c;实现集中管理&#xff0c;将云服务部署其上&#xff0c;及时响应终端请求。然而&#xff0c;成千上万的边缘节点散布于各地&#xff0c;例如银行网点、车载节点等&#xff0c;节点数量甚…

Mybatis源码阅读(二):动态节点解析2.2 —— SqlSourceBuilder与三种SqlSource

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

搞懂toString()与valueOf()的区别

一、toString&#xff08;&#xff09; 作用&#xff1a;toString&#xff08;&#xff09;方法返回一个表示改对象的字符串&#xff0c;如果是对象会返回&#xff0c;toString() 返回 “[object type]”,其中type是对象类型。 二、valueOf( ) 作用&#xff1a;valueOf房啊发返…