请问怎么C++里 用位运算怎么计算一组整型数据的最大值

来源:百度知道 编辑:UC知道 时间:2024/05/12 16:28:43
不用任何判断语句 对所输入的整型数据进行比较 求出中的最大值

只用位运算比较两个整型数据的大小可以使用如下函数:

#define MASK 0x7FFFFFFF
int max(int x, int y)
{
unsigned char sx; // 保存x的符号位
unsigned char sy; // 保存y的符号位
unsigned char s; // x,y在去掉符号位后,如果y大,则s=1;否则为0
unsigned char MaxIsY; // 如果最大值是y,则为1,否则为0

//保存符号位
sx = (x>>31)&0x01;
sy = (y>>31)&0x01;

//去掉符号位后相减并右移31位(如果x<y,则值是负数,右移31位后取得符号位为1)(注意负数的补码格式)
s = (((x&0x7FFFFFFF)-(y&0x7FFFFFFF)) >> 31)&0x01;

//加入符号判断,如果符号相同,则s就是比较大小值,如果符号不同则取正数的那个为最大值
MaxIsY = ((!(sx^sy))&s)|((sx^sy)&sx);

return (!MaxIsY)*x + MaxIsY*y;
}

多个数据比较,可以使用以上函数两两比较!

必须用位运算吗?
如果可以只用浮点运算,并且允许一定的误差的话,高数里数列极限那一部分有个结论也许有用(也是不用任何判断语句的):
已知任意的包含m个元素的非负数组{a1,a2,a3....am},
设正整数n,则算式:n次根号下(a1的n次方+a2的n次方+……+am的n次方),当n趋于无穷大时的极限就是数组中的最大值。
因此你可以取一个很大的n,只需要做m个指数运算和加法运算,最后来个开n次方(其实也是指数运算),就能得到一个接近于最大值的数。
刚复习高数时看到一道证明题想到了这个用法。没有实验,楼主看有用没。

位运算就像基本的四则运算一样
如果不用判断