位运算---不用任何比较判断找出两个数中的最大值
来源:互联网 发布:数据库表设计 编辑:程序博客网 时间:2024/06/06 09:54
【题目】
给定两个32位整数a和b,返回a和b中较大的一个。要求不能使用比较判断。
【基本思路】
方法一。得到a - b的符号就可以知道a和b哪一个大了。具体过程参照如下代码:
int getMax1(int a, int b){ int c = a - b; int scA = sign(c); int scB = flip(scA); return a * scA + b * scB;}int flip(int n){ return n ^ 1;}int sign(int n){ return flip(n>>31 & 1);}
其中sign函数的功能是返回整数n的符号,正数和0则返回1,负数返回0(在二进制表达中符号位0表示正,1表示负,注意不要搞混)。flip函数的功能是:如果n为0返回1,如果n为1返回0.
方法二。在方法一中存在一定的局限性,那就是如果a - b的值发生溢出,返回的结果就会不正确。方法二能很好的解决这个 问题,首先看如下的代码:
int getMax2(int a, int b){ int sa = sign(a); int sb = sign(b); int sc = sign(a - b); int difSab = sa ^ sb; int sameSab = flip(difSab); int returnA = sa * difSab + sc * sameSab; int returnB = flip(returnA); return a * returnA + b * returnB;}
简单解释一下。
如果a和b的符号不同(difSab = 1, sameSab = 0),则有:
如果a为0或正,那么b为负(sa = 1, sb = 0),应该返回a
如果b为0或正,那么a为负(sb = 1, sa = 0),应该返回b
如果a和b的符号相同(difSab = 0, sameSab = 0),此时一定不会发生溢出:
- 如果a - b为0或者为正(sc = 1),返回a
- 如果a - b为负(sc = 0 ),返回b
阅读全文
2 0
- 位运算---不用任何比较判断找出两个数中的最大值
- 不用任何比较判断找出两个数中较大的
- 不用任何比较判断找出两个数中较大的数
- 不用任何比较判断找出两个数中较大的数。
- 位运算之不使用任何比较判断比较两个数大小问题
- 不用任何比较运算,返回2个数中的最大数
- 不通过比较,找出两个数的最大值
- 不通过比较,找出两个数的最大值
- 不使用比较运算符求两个数的最大值or最小值【位运算】
- 有两个变量a,b不用if ?: switch或其他判断语句找出两个数中比较大的数
- 不用任何算术运算符计算两个数的和
- 不用比较运算,求两个数中的最大数和最小数
- 两个变量a,b,不用“if”,“? :”,switch或者其它判断语句,找出两个数中间比较大的
- 有两个变量a和b,不用“if”、“? :”、“switch”或其他判断语句,找出两个数中比较大的
- 算法8—不通过比较,找出两个数的最大值
- 求2数的最大值,(不用比较运算符)
- C++ 不用判断运算符进行比较两个数的大小
- 不用判断语句,求两个数的最大值
- js简单删除数组中任意元素
- 关于threadlocal的理解
- 30.File
- PAT-AL 1033. To Fill or Not to Fill
- 7-5 通讯录排序
- 位运算---不用任何比较判断找出两个数中的最大值
- [Tesseract]Tesseract 在 Visual Studio 2012 中的配置及调用
- 比较 ReentrantLock 和 synchronized 的使用和可伸缩性
- Android知识理解
- 动态规划--01背包问题
- 书写在遇到困难时-tag1
- HDU
- 盒子模型
- Apache Flink vs Apache Spark