不用if,?:,等判断语句获得两数之中较大的或较小的数
2012-08-27 16:25
232 查看
int getMax(int a,int b){ int num[2]={a,b}; return num[((a>>31 ^ b>>31) & (a>>31 & 1)) | ( !(a>>31 ^ b>>31) & ((a-b)>>31 & 1)) ]; } int getMin(int a,int b){ int num[2]={b,a}; return num[((a>>31 ^ b>>31) & (a>>31 & 1)) | ( !(a>>31 ^ b>>31) & ((a-b)>>31 & 1)) ]; } void main() { int a=0x7FFFFFFF,b=0xFFFFFFF0; cout<<getMax(a,b)<<endl; cout<<getMax(b,a)<<endl; cout<<getMin(a,b)<<endl; cout<<getMin(b,a)<<endl; a=0x7FFFFFFF,b=0xF; cout<<getMax(a,b)<<endl; cout<<getMax(b,a)<<endl; cout<<getMin(a,b)<<endl; cout<<getMin(b,a)<<endl; a=0xFFFFFFF0,b=0xFFFFFF00; cout<<getMax(a,b)<<endl; cout<<getMax(b,a)<<endl; cout<<getMin(a,b)<<endl; cout<<getMin(b,a)<<endl; a=0xFFFFFFF0,b=0x7FFFFFFF; cout<<getMax(a,b)<<endl; cout<<getMax(b,a)<<endl; cout<<getMin(a,b)<<endl; cout<<getMin(b,a)<<endl; }
若a,b异号,即(a>>31 ^ b>>31)为1
则若a>>31 & 1为0,表示a为正,应该返回0,表示a大。若a>>31 & 1为1,表示a为负,应该返回1,表示b大。
若a,b同号,即(a>>31 ^ b>>31)为0
则(a-b)不会溢出,可以通过二者相减的符号位来判断ab大小。
相关文章推荐
- 不用”if“,”?:“,”switch“或其他判断语句,求两个数中较大的数或较小的数
- 选出两个数中较大者,不用if, ? : ,switch等判断语句.
- 有两个变量a和b,不用if等判断语句,求两者较大的值
- 不用判断语句求出两数较大值
- 【面试题】不用if,条件表达式,switch等判断语句------找出两个数中较大的
- 求1+2+...+n的前n项和,但不用乘除法、for、while、if、else、switch、case等关键字及条件判断语句
- 不用比较运算符及循环控制语句,判断int型的a、b两数的大小
- c语言:不用if,else语句,也不用循环条件等,输入一个字符,判断是否为大写字母
- 求1+2+。。。+n,不用乘除,for、while、if、else、switch、case等关键字及条件判断语句
- 不用if else 等判断语句判断两个数值的大小
- PHP 不用求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 两个变量a,b,不用“if”,“? :”,switch或者其它判断语句,找出两个数中间比较大的
- 给定两个int a和b,不使用if-else等比较和判断运算符,请返回较大的一个数。若两数相同则返回任意一个
- 有两个变量a 和 b,不用if、?: 、switch 或者其他判断语句,找出两个数中比较大的那个
- js算法一则:不用if。。while。。for等循环和判断语句实现1+2+3+...+n的和
- 不用判断(if else等)和跳转语句(for while 等)求和以及连续输出
- 有两个变量a 和 b,不用if、?: 、switch 或者其他判断语句,找出两个数中比较大的那个
- 关于不用if,switch,?:语句判断两个数大小及其他
- 不用比较运算符及循环控制语句,判断int型的a、b两数的大小
- 不用if、条件语句实现取较大值 未完待续...