位运算之不使用任何比较判断比较两个数大小问题
来源:互联网 发布:无线网本地网络设置 编辑:程序博客网 时间:2024/05/22 00:35
【题目】
对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。
给定两个整数a和b,请返回较大的数。
测试样例:
1,2
返回:2
【分析】
不用分析了,直接给代码,我第一次没有仔细读题,实际上用了判断的,解法1作为参考,解法2是正确答案。
解法一(结果正确,但是不符合题意):
class Compare {public: int getMax(int a, int b) { if(a < 0 && b > 0) return b; if(a > 0 && b < 0) return a; bool native = a < 0 ? true : false; unsigned int test = 1 << 30; //直接到符号为下一位,一次性移位30,不用while()...<<=1这样子 int res = a; for(int i=0; i<30; ++i){ if((test&a) != 0 && (test&b) == 0) break; else if((test&b) != 0 && (test&a) == 0){ res = b; break; } test >>= 1; } return native ? (res == a ? b : a) : res; }};
class Compare {public: int getMax(int a, int b) { int c = a - b; int sa = sign(a); int sb = sign(b); int sc = sign(c); int diffab = sa ^ sb; int sameab = filp(diffab); int returnA = sameab * sc + diffab * sa; int returnB = filp(returnA); return returnA * a + returnB * b; }private: int sign(int n){ return filp((n >> 31) & 1); //注意这里有一次filp,因为正数为1 } int filp(int n){ return n ^ 1; }};
解法二真正没有使用比较,仅仅是通过正负符号来判断。如果同号,a-b的符号可以作为判断条件,且不会溢出。如果异号,通过表达式returnA * a + returnB * b的互斥特性,必然有一个负数符号为0,就返回了另外一个数。
0 0
- 位运算之不使用任何比较判断比较两个数大小问题
- 不使用判断比较符比较两个整数的大小(位运算)
- 位运算---不用任何比较判断找出两个数中的最大值
- 不使用比较运算符求两个数的最大值or最小值【位运算】
- 不用比较运算符比较两个数的大小
- 不用比较运算符比较两个数的大小
- 每日一题:编写一个函数,不使用算术运算符,实现比较两个数的大小
- 不用任何比较判断找出两个数中较大的
- 比较两个数大小
- 比较两个数大小
- 两个数比较大小
- 两个数比较大小
- 比较两个数大小
- 两个数比较大小
- 两个数比较大小
- C++ 不用判断运算符进行比较两个数的大小
- 如何不进行逻辑判断来比较两个数的大小
- 通过条件运算符比较两个数大小或比较三个数大小
- Python科学计算三
- java的System.getProperty()
- H.264 x264 h264 AVC1的关系和区别
- 设计与编码
- nginx搭建tomcat分布式集群
- 位运算之不使用任何比较判断比较两个数大小问题
- 支付宝
- 讲一讲 Canvas 究竟是个啥
- 13学生成绩处理
- 【小QのSpringBoot-翻译】Spring Boot官方参考指南-第三部分 使用Spring Boot
- 《亿级流量网站架构核心技术》目录一览
- linux高性能服务器编程之EPOLLONESHOT事件
- android.os.FileUriExposedException 解决方法
- react native 这样理解运行机制