题目:有两个变量a,b,不用if 、?:、switch 等判断语句,找出两个数中的最大者。
分析:我的思路是用a-b,看一下结果是正还是负,不用判断语句,不能与0比较,可以将两者的差值赋给int型变量c,看一下c的最高位是0还是1,同样不能用switch来判断。可以定义一个数组num[2]={a,b},c进行右移位操作,c>>=31(32位操作系统)。当a>b时,c的值为零,返回num【c】,既是a,同理当a<b时,返回num【c】,既是b,因此代码如下:
int a,b;
cin>>a>>b;
int num[2]={a,b};
int c=a-b;
c>>=31;
cout<<num[c]<<endl;
然而程序的输出结果并不正确,当a大时,没有问题,当b大时,通过单步调试看到c的值为-1!!
然后查了一下带符号整数的移位问题,总结如下:
1、负整数的二进制表示:
对于负整数比如-5,
化为二进制数:10000000 00000000 00000000 00000101
其反码表示为:11111111 11111111 11111111 11111010
其补码表示为:11111111 11111111 11111111 11111011
2、负整数的移位:
比如c=-5; c>>=1;
则对c的补码进行向右移位,而且右移一位后,高位仍然补上1,(10

本文通过一个编程问题引入,探讨了负整数的二进制表示和移位操作。在不使用判断语句的情况下,尝试通过移位找到两个数中的最大者。然而,由于负数移位的特殊性,导致初始方法出现错误。文章深入解析了负整数的反码和补码表示,并指出右移31位会导致-1的结果。最后,提出了一种更优的解决方案:利用算术运算实现无条件的选择最大值。
最低0.47元/天 解锁文章
602

被折叠的 条评论
为什么被折叠?



