1.请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
这个题目很早了,网上有很多讨论
思路很多,看到其中有一个思路是 ((a+b)+abs(a-b))/2 就可以得到其中的大数了
确实很精彩,用数学方法,不过其中用到了abs函数
如果把abs函数也自定义了就好了
说干就干
写一个
int abs(int x)
{
return (((x>>31)&1)?(~x+1):x) //?:不算是if语句吧
}
解释一下
x>>31位,将符号位移到最右端(当前的int还是32位的....以前16,以后64或更高...)
考虑到如果是负数的话左边会补1而不是补0
屏蔽一下
(x>>32)&0x00000001
也就是(x>>32)&1
在C++里面,0为false,非0为true
当有符号(负数)时,条件为真,则应计算绝对值了,否则直接返回
对负数求相反数
首先要知道负数在计算机内部的表示是补码表示的
关于补码的知识,请查相关书籍,计算机相关课程应该介绍过了
取反+1得补码得相反数
(~x+1)
好了,将abs(x)替换到原式((a+b)+abs(a-b))/2
同时将a+b等都加上括号
得到最终得结果
#define max(a,b) (((a)+(b))+(((((a)-(b))>>31)&1)?(~((a)-(b))+1):((a)-(b))))/2
验证后,结果正确
补充一点:
max和min函数,用宏定义得经典实现
#define max(a,b) (a>b)?a:b
中,存在重复计算问题
比如
max(i++,j--)
这样的式子,展开后就.....
这个问题在我定义的max中同样存在着,
如果想避开这个问题,就用函数吧,
不过函数又存在类型检查的问题
你说:我用模板,
好了模板也有类型匹配和类型转换的问题
讨论到此为止,实现一个完美的max或者min函数不是那么简单的问题
在一些C++讨论区中有详细的讨论
还是用宏定义吧,使用时注意规则就是了.
再看看我们那个有些晕的宏哥哥
#define max(a,b) (((a)+(b))+(((((a)-(b))>>31)&1)?(~((a)-(b))+1):((a)-(b))))/2
分享到:
相关推荐
这篇文档主要介绍了ACM竞赛中常用的编程技巧和算法模板,包括宏定义、快速输入输出、快速幂运算、最大公约数(GCD)、最小公倍数(LCM)、扩展欧几里得算法、以及组合数计算与Lucas定理。下面我们将逐一详细讲解这些知识...
在这里,我们定义了一个宏`EXCHANGE`,它接受三个参数`x`、`y`和`temp`。在宏展开时,`x`、`y`和`temp`被实际的变量替代,完成交换。宏交换的优点是执行效率高,因为它在编译时就已经完成了交换,不需要额外的函数...
题目中的`#define MAX(a,b)`是一种宏定义,用于比较两个数`a`和`b`的大小。在C/C++中,宏定义是在预处理阶段完成的文本替换,而不是运行时的计算。这里的宏定义巧妙地利用了减法和绝对值的性质,避免了使用大于或...
示例代码中给出的宏定义实际上是一个错误的例子,因为其中使用了除法操作,而题目要求不使用条件语句。正确的实现应该利用条件运算符`? :`,例如: ```c #define MAX(a, b) ((a) > (b) ? (a) : (b)) ``` #### 输出...
1.29 为什么我的编译器不允许我定义大数组,如doublearray[256][256]? 命名空间 1.30如何判断哪些标识符可以使用,哪些被保留了? 初始化 1.31 对于没有显式初始化的变量的初始值可以作怎样的假定?如果一个...
1.29 为什么我的编译器不允许我定义大数组,如double array[256][256]? 15 命名空间 15 1.30 如何判断哪些标识符可以使用,哪些被保留了? 15 初始化 18 1.31 对于没有显式初始化的变量的初始值可以作怎样的...
### 腾讯笔试题知识点解析 ...以上是对腾讯笔试题中几个典型题目的详细解析,涵盖了宏定义、高精度算法、链表操作等多个方面的知识。希望这些解析能够帮助准备参加腾讯笔试的同学更好地理解和掌握相关知识点。
宏定义比较两个数的大小 - **题目描述**:定义一个宏,用于比较两个数a、b的大小,不能使用大于、小于或if语句。 - **示例代码**: ```cpp int const shift = sizeof(int) * 8 - 1; unsigned mask = (0x1 ); ...
- **题目**:编写一个高精度算法实现两个大数的乘法,支持任意长度的小数。 - **算法思路**: 1. 计算小数点的位置。 2. 去掉小数点,将两个数转换为整数。 3. 使用标准乘法或者更高效的算法(如Karatsuba乘法)...
#### 宏定义实现数值比较 1. **题目要求**:定义一个宏来比较两个数`a`、`b`的大小,不能使用大于、小于、if语句。 - **解析**:在C语言中,宏是一种文本替换工具,可以通过预处理器实现条件判断的功能。由于题目...
**题目**:求一个数组的第2大数。 **解析**:可以通过一次遍历来找到数组中的最大值和次大值。在遍历过程中维护两个变量,分别记录最大值和次大值。遍历完成后,次大值即为数组中的第二大的数。这种方法的时间复杂度...
在这个阶段,编译器会检查代码的语法错误,并处理宏定义、类型检查等。 - **运行时**:是指程序被执行的过程。在这个阶段,程序的逻辑开始被执行,如变量赋值、函数调用等。运行时错误通常包括空指针解引用、数组...
OpenSSL中的哈希表通常使用`CRYPTO_HASH`宏定义,通过`HASH`结构体来表示。该结构体包含了哈希值、指针数组等字段。 **5.3 函数说明** - `CRYPTO_HASH_new`: 创建一个新的哈希表实例。 - `CRYPTO_HASH_insert`: 向...
5. **预处理器**:C语言的预处理器可以用来包含头文件、宏定义和条件编译,这对于编写可复用的代码和适配不同环境很有帮助。 6. **文件操作**:部分LeetCode题目涉及读写文件,C语言提供了标准I/O库(stdio.h)来...
`#define` 预处理指令用于定义宏,其后必须跟一个标识符作为宏名。如果没有提供标识符,则会出现此错误。 #### Division by zero (除以零) 试图将一个数除以零是非法的数学操作,C++ 编译器会在运行时抛出异常或在...
- **解释**:当在宏定义中使用了 `#` 操作符但没有紧跟一个宏参数名时,会触发此错误。 - **解决方法**:确保每个 `#` 操作符后面都跟着一个有效的宏参数名。 5. **'xxxxxx' not an argument ('xxxxxx' 不是参数)...
- **宏定义**: 提供了一系列用于简化ASN.1操作的宏。 **13.7 ASN1常用函数** - **创建对象**: `ASN1_OBJECT *obj = OBJ_txt2obj("oid", 1);` - **获取OID**: `const char *oid = OBJ_nid2sn(OBJ_obj2nid(obj));` ...