位运算之不使用任何比较判断比较两个数大小问题
2016-12-19 18:00
1491 查看
【题目】
对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。
给定两个整数a和b,请返回较大的数。
测试样例:
1,2
返回:2
【分析】
不用分析了,直接给代码,我第一次没有仔细读题,实际上用了判断的,解法1作为参考,解法2是正确答案。
解法一(结果正确,但是不符合题意):
解法二:
解法二真正没有使用比较,仅仅是通过正负符号来判断。如果同号,a-b的符号可以作为判断条件,且不会溢出。如果异号,通过表达式returnA * a + returnB * b的互斥特性,必然有一个负数符号为0,就返回了另外一个数。
对于两个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,就返回了另外一个数。
相关文章推荐
- 位运算---不用任何比较判断找出两个数中的最大值
- 嵌套括号匹配问题/不使用比较运算求出两个数的最大值和最小值问题
- 每日一题:编写一个函数,不使用算术运算符,实现比较两个数的大小
- 不使用任何判断,如if,?:,switch,计算两个数中的最大值!
- C语言笔试题精选1---求两个数之间较大的数,不使用if、while、switch、for、?:/以及任何比较语句
- 定义一个宏,不用if switch > < 等任何判断语句 比较a和b的大小
- 不使用比较运算就可以求出两个数的最大值与最小值
- 每日一题:编写一个函数,不使用算术运算符,实现比较两个数的大小
- 不用判断语句比较两个数的大小值
- Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API
- 第16周项目二运用指针比较两个数的大小(需调试,不知问题出在哪)
- Integer类型数据比较大小问题:(Integer定义的是对象,养成使用equals方法的好习惯)
- 不使用条件判断和比较运算符来比较大小
- 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句
- C语言小试牛刀两个初级程序练习------1到100的加法运算,两个数大小的比较
- Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API.
- 不用判断语句比较两个数的大小值
- 08-14 比较两个数的大小,不用判断语句
- 算法--两个数大小比较,不用分支判断
- 一道腾讯的笔试题,不使用任何判断语句求出两个数中的较大者(即 if、if...else...、>、<、==、while等语句)