问题:如何实现一个扩展为整型常量表达式的宏E
,使得...
(E != (X) && E != (Y) && E != (Z))
...对于 X
、Y
和 Z
的每个选择作为具有不同的非负值的整数常量表达式的计算结果为 1?
例子:
#define X 13
#define Y 45
#define Z 76
#define E FUNC(X,Y,Z)
#define FUNC(X,Y,Z) ??
E /* evaluates to any number distinct from all of 13, 45, and 76 */
使用哪个公式?有什么想法吗?
最佳答案
Given any 3 numbers
X
,Y
andZ
, produce anint
constant that is different from all 3 values.
显然 0
、1
、2
或 3
必须满足条件。所以这是一个解决方案:
#define FUNC(x,y,z) (((x) != 0 && (y) != 0 && (z) != 0) ? 0 : \
((x) != 1 && (y) != 1 && (z) != 1) ? 1 : \
((x) != 2 && (y) != 2 && (z) != 2) ? 2 : 3)
这是一个更微妙的解决方案,根据最后一个计算结果为 0
、1
、2
或 3
每个参数的 2 位,但只对参数求值一次:
#define FUNC(x,y,z) ((int)((0x10201030102010 >> \
(4 * ((1 << ((x) & 3)) | \
(1 << ((y) & 3)) | \
(1 << ((z) & 3))))) & 3))
解释:
4
,然后将魔数(Magic Number) 0x10201030102010
移动那么多,然后掩码 3,以选择一个不同于所有余数的值。可读性较差的版本将乘以 2
并移位 0x484C484
,仅使用 32 位算法:
#define FUNC(x,y,z) ((int)((0x484C484 >> ((2 << ((x) & 3)) | \
(2 << ((y) & 3)) | \
(2 << ((z) & 3)))) & 3))
https://stackoverflow.com/questions/71452192/