今天面试碰到了这个问题,知道是位操作,不过当时没想起来,回来查了查总结一下。其实方法很简单,就是相减后看符号位,将减的结果的符号位移位到末尾,再和1与操作,或者直接和0x80000000与,得出的符号位再右移至末尾,作为数组的下标。int型占4字节,即32位,在-1为补码的机器上,1代表负数,0代表正数
int max(int x,int y)
{
int buf[2]={x,y};
unsigned int z;
z=x-y;
z=z>>31;//符号位移至末尾,作为数组下标
return buf[z];
}
上述代码是从网上查的,这是基础版本,但是未考虑内存溢出,如127-(-128)得出的结果超出了8位所能表示的数。并且上述版本不可直接用java写,java中没有无符号类型,因为java中右移运算补位是根据符号位,符号位为1就补1,符号位为0就补0,因此右移后可和1与操作。
下面的版本是考虑溢出,即判断两个数的符号相同否,相同的话就不会产生溢出。不相同的话,直接看符号位就ok了。下面上代码。
int max1(int x,int y){//符号相同,返回x,y中的大值
unsigned int z;
z=((x-y)>>31)&1;
return (1-z)*x+z*y;//这种写法很巧妙
}
int max2(int x,int y){//符号不同,直接判断x的正负即可,返回最大值
unsigned int z;
z=(x>>31)&1;
return (1-z)*x+z*y;
}
int max(int x,int y){
unsigned int z;
z=((x^y)>>31)&1;//异或操作,判断符号位是否相同
return (1-z)*max1(x,y)+z*max2(x,y);
}
在考虑溢出的情况下,unsigned int z=((x^y)>;>;31)&1的值有两种可能,x、y同号时为0,x、y异号时为1。当x、y同号时x-y不会溢出,可参考max1,得出最大值;当x、y异号时,取正的那个就是最大值max。
其实上述的巧妙部分是基于插值,有人给出了精简的程序,思想同上。int max (int a, int b)
{
int g, r1, r2;
g = ((a^b) >;>; 31) & 1;
r1 = (a >;>; 31) & 1;
r2 = ((a-b) >;>; 31) & 1;
return g*(r1*b + (1-r1)*a) + (1-g)*(r2*b + (1-r2)*a);
}
总结一下:
1、基本思想:位操作,找符号位
a^b 的最高位 ---- 判断符号是否相同
a-b 的最高位 ---- 在符号相同的情况下判断大小
a 的最高位 ---- a的符号
b 的最高位 ---- b的符号
2、得出大(小)的数
把大小关系对应到一个数组当中
使用插值
分享到:
相关推荐
3. 编程输入两个整型数据a和b,若a^2+b^2的结果大于100,则输出a^2+b^2的值,否则输出a+b的结果。 在这个问题中,我们使用了if语句来判断a^2+b^2的结果,然后使用printf函数输出结果。此外,我们还使用了逻辑运算符...
本压缩包中的"案例1"可能包含了一个具体的示例,用于演示如何在微信小程序中比较两个数字的大小。下面将详细介绍在微信小程序中比较数字大小的方法、注意事项以及相关的JavaScript知识点。 1. **基本比较运算符**:...
关系运算符用于比较两个操作数的大小关系。Java 中的关系运算符包括: * 小于:< * 大于:> * 小于或等于: * 大于或等于:>= * 等于:== * 不等于:!= 这些运算符可以用于比较数字、字符和字符串。 四、逻辑...
在使用if语句和switch语句时需要注意一些细节,如if语句后面的表达式之后不能增加分号,同时注意语句后面的分号不能遗漏。在if和else后面可以只包括一个内嵌的操作语句,也可以包括多个操作语句,此时务必用“{}”将...
在实际应用中,逻辑判断通常与其他控制结构(如条件语句`if`、`switch`等)结合使用,以实现更复杂的逻辑功能。例如,在循环中检查多个字符串的相对大小,或者根据字符串比较结果执行不同的操作。 总的来说,逻辑...
应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系如下: &a--->a567 a为变量名,567是变量的值,&a是变量a的地址。在...
这里使用了`if`语句来判断判别式`disc = b*b - 4*a*c`是否大于0。如果判别式大于0,说明方程有两个实根,可以使用公式求解并打印结果。否则,输出"没有实根"。 4.2 `if`语句的扩展 4.2.1 复合`if`语句 复合`if`语句...
在 Python 中,也可以在同一行的位置上使用 if 条件判断语句,例如: ``` var = 100 if ( var == 100 ) : print "变量 var 的值为 100" print "Good bye!" ``` 这条语句将执行 print 语句,并输出结果为:变量 var ...
在C语言中,选择结构程序设计可以使用if语句、switch语句、关系运算符和逻辑运算符来实现,例如判断三角形的三边是否可以构成三角形、比较两个数的大小、输出奇数或偶数等。选择结构程序设计的设计思想是根据不同的...
[ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”}, {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”}, ] hashes {“you”:”a”,”me”:”b”,”he”:”c”} 注释标志 这里是注释 --> 旧版本的freemarker采用...
例如,在实验3-1中,算法思想是使用if语句来判断两个数中的最大值;在实验3-4中,算法思想是根据购买打印纸的数量来确定单价和总价格。 6. 实验3-1算法:实验3-1的算法思想是使用if语句来判断两个数中的最大值。...
3.15 我要检查一个数是不是在另外两个数之间,为什么if(abc)不行? 3.16 为什么如下的代码不对?inta=1000,b=1000;longintc=a*b; 3.17 为什么下面的代码总是给出0?doubledegC,degF;degC=5.0/9*(degF-32); ...
需要注意的是,条件表达式不能完全替代if/else语句,尤其是在需要执行多条语句时。 if语句是控制结构中的重点,它根据条件表达式的真假来决定执行哪部分代码。if语句有三种形式:基础的if语句、if-else语句和if-...
中,返回的两个表达式之间,使用 : 号隔开,而不是 , 号,注意了: 代码如下:string h = (k<10) ? “k小于10″:”k大于或等于10”; 当然,这种表达式适合简单的比较后返回值处理,但对于根据比较结果而执行大量...
2、如果 a 大于 b的话 ,则交换两个数字的位置 使用 短路&&,扩展赋值运算符,位运算 4、条件运算符(三目运算) 单目(一元)运算符 :++,--,! 双目(二元)运算符 :+,-,*,/,%,>,<, ... ... 三目(三元)运算符 ...
关系运算符用于比较两个操作数之间的大小关系,其结果为布尔值(`true` 或 `false`),在C语言中以数字`1`(真)和`0`(假)表示。 - **运算符**: `, `>`, `, `>=`, `==`, `!=` - **示例**: - `a > b`: 检查a是否...
这些运算符常用于条件语句中,例如`if`语句和`switch`语句,以根据比较结果执行不同分支。 3. **逻辑运算符** - 逻辑与 (&&):如果两边的布尔表达式都为真,结果才为真。 - 逻辑或 (||):如果两边的布尔表达式中...
3.15 我要检查一个数是不是在另外两个数之间,为什么if(a b c)不行? 40 3.16 为什么如下的代码不对?int a=1000, b=1000; long int c=a * b; 40 3.17 为什么下面的代码总是给出0?double degC, degF; degC= ...
* If:如果(判断语句)。 * Else:否则(判断语句)。 * Switch...case:选择语句。 * Default:默认条件。 * While:先判断条件是否成立再循环。 * Do...while:执行循环语句后判断是否符合条件。 * Assert:断言...