定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 以及 不用 第三个数,交换 a,b的值

无意中 一篇博文,介绍这个问题,引起了我的兴趣。

博文中 介绍了 三种方法:

1.

#define max(a,b) ((((a)-(b))&(1<<31))?(b):(a))

2.

#define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a))

3

#define max(a,b) (((abs((a)-(b)))==((a)-(b)))?(a):(b)) 

第一种方法 和第二种方法 的原理都是一样的,就是 根据 (a) - (b) 的结果 的 符号位 来判断 的,但是 忽略了 类型的问题,在不同的机型上 int 可以是 16 位 或者 32 位,

long 可以是 32 位 或者 64位 ,用 1<<31 或者 0x80000000   和  (a) - (b) 来进行 & 运算 都是 不合适的。

第三种方法正好解决了 上面的问题。但是 忽略了 浮点型问题。

所以 最好的方法 是 将 abs 换成 fabs

#define max(a,b) (((fabs((a)-(b)))==((a)-(b)))?(a):(b)) 

下面 来说另一个话题: 假设 有 int a = 7 , int b = 8 ,不用 第三个数 来 交换 a,b

答案:

a = a + b;
b = a - b;
a = a - b;

时间: 2024-11-11 01:17:34

定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 以及 不用 第三个数,交换 a,b的值的相关文章

请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句(转载)

笔试的时候经常问这些: 方法一: #define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a)) 若a>b,则a-b的二进制最高位为0,与上任何数还是0,所以大数为a: 否则,a-b为负数,最高位为1,与上0x80000000(最高位为1其他为0)之后为1,所以此时最大数为b. 方法二: #define max(a,b) ((((a)-(b))&(1<<31))?(b):(a)) 方法三:      1.#define 

Python基础课:定义一个函数,可以对序列逆序的输出(对于列表和元组可以不用考虑嵌套的情况)

1 15 def fun(arg): 2 16 if type(arg) is not tuple 3 17 and type(arg) is not str 4 18 and type(arg) is not list: 5 19 print('请输入一个序列') 6 20 return None 7 21 8 22 tmp_list = list(arg) 9 23 tmp_list.reverse() 10 24 11 25 if type(arg) == tuple: 12 26 arg

两个变量,不用第三个数就进行切换数值

var a = 5; var b = 6; //第一种方法: a = a+b; b = a - b; a = a - b; //第二种方法: a = [a,b]; b = a[0]; a = a[1];

[算法]不用第三个数交换2个数的位置

int a = 10; int b = 20; 第一种方法: a = a + b; b = a - b; a = a - b; 第二种方法: a = a ^ b; (^   语言中是异或的意思,同为0 异为1  1 ^ 1 = 0, 0 ^ 0 = 0, 1 ^ 0 = 1) b = a ^ b; a = a ^ b; 第三种方法  (这种方法容易越界)如果a 大于int型最大值了! a = (a + b) - (b = a);

[c]不用第三个数,去交换二个数的位置

int a = 10; int b = 20; 第一种方法: a = a + b; b = a - b; a = a - b; 第二种方法: a = a ^ b; b = a ^ b; a = a ^ b; 第三种方法 a = (a + b) - (b = a); 版权声明:本文为博主原创文章,未经博主允许不得转载.

贪心算法之随机三个数的最小公倍数

问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 9 样例输出 504 数据规模与约定 1 <= N <= 106. 代码: import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner in=new Scanner(Sy

用一个宏实现求两个数中的最大数

用一个宏实现求两个数中的最大数 在面试或者笔试中,经常会碰到"用一个宏实现求两个数中的最大数"这个题目,一般情况下,大家看到这个问题,觉得很容易实现,这有什么难度呢,随手就是一个: #define MAX(x, y) ((x) > (y) ? (x) : (y)) 注:用括号将宏定义整个括起来,在任何时候,都是一个好习惯. 如果能写出上边这个宏,你这道题的考试就能交差了,然后觉得对自己来说就是随手一写的事儿,那可就大错特错了.因为以上写法的宏定义,虽然也能拿到分数,但是在面试者或

24.定义一个整型变量,赋予1-100值。要求用户猜这个数,比较两数大小,把结果提示给用户,直到猜对为止

? #include<iostream> using namespace std; int main() { int a=50; int n; while(1)//关键,造成一个死循环 { cout<<"please input an number: "<<endl; cin>>n; if(a==n)//循环退出条件 { cout<<"n="<<n<<endl; break; }el

一个宏定义引发的问题

问题1:对与buffer宏定义的理解 一些得到的基本结论:int型数据占有一个字的空间,char型数据占有一个字节的空间,并且char数据类型的定义是为ASCII字符表量身定制的 对与buffer的理解: #define buffer ((char*) * (int far*)0x200) 首先,复习对与基本宏定义的知识:对于# define pi (3.14)即pi = 3.14,在此我们首先应该认识到,最外面的括号仅仅是一个结构,来说明里面的内容是一个整体. 下面来研究buffer究竟是什么