C 这个MIN宏是如何工作的?
如果这是个愚蠢的问题,请原谅。我似乎无法理解以下MIN宏是如何工作的: 定义最小值(x,y)(y)^((x^y)和-(xC 这个MIN宏是如何工作的?,c,macros,C,Macros,如果这是个愚蠢的问题,请原谅。我似乎无法理解以下MIN宏是如何工作的: 定义最小值(x,y)(y)^((x^y)和-(x
MIN
宏中进行编辑,我或这里的其他人应该能够帮助解释它
例如:
#包括
#定义加号+
int main(){
printf(“%d”,(1加3));
}
这应该只输出4
编辑
让我们分析一下你的宏
我们有
(y) ^ ((x ^ y) & -(x < y))
(y)^((x^y)和-(x
- 让我们看最后一部分,
。如果(x
小于x
和y
else,则为1
。因此,1
将是-(x
,如果0xffffffff
更小,而x
则是0
- 所以现在,
变成((x^y)&-(x
,也就是说,如果x小于y,那么((x^y)&0xffffffffff)
,即((x^y)&0)
0
- 因此,如果x较小而
,则整个宏变为(y)^0
,即(y)^(x^y)
,否则。这确实是所需的x
功能MIN
MIN
宏中进行编辑,我或这里的其他人应该能够帮助解释它
例如:
#包括
#定义加号+
int main(){
printf(“%d”,(1加3));
}
这应该只输出4
编辑
让我们分析一下你的宏
我们有
(y) ^ ((x ^ y) & -(x < y))
(y)^((x^y)和-(x
- 让我们看最后一部分,
。如果(x
小于x
和y
else,则为1
。因此,1
将是-(x
,如果0xffffffff
更小,而x
则是0
- 所以现在,
变成((x^y)&-(x
,也就是说,如果x小于y,那么((x^y)&0xffffffffff)
,即((x^y)&0)
0
- 因此,如果x较小而
,则整个宏变为(y)^0
,即(y)^(x^y)
,否则。这确实是所需的x
功能MIN
x
,则-(x
的结果将仅为0。因此,它相当于:
y ^ 0
这是y
请注意,如果
,则x
的结果将仅为0。因此,它相当于:-(x
这是y ^ 0
y
如果x小于y,则:如果x小于y,则:
是1(x
为-1-(x
是((x^y)和-(x
,这是((x^y)和-1)
,因为(x^y)
,因为-1都是“1”位(anything&-1)==anything
是y^(x^y)
,因为XOR是可交换的,而y的值被抵消x
为0(x
为0-(x
是((x^y)和-(x
,这是((x^y)和0)
,因为0
,因为0都是“0”位(任何东西&0)==0
是y^0
y
当前扩展为MIN(2,3)*4
,计算结果为7,而不是正确的8,因为乘法在最后的XOR之前完成。出于同样的原因,最好在每个参数替换前后加上括号:(3)^((2^3)和-(2<3))*4
#define MIN(x, y) ((y) ^ (((x) ^ (y)) & -((x) < (y))))
只有当平台使用整数时,宏仍然有效,并且它可能不会比MIN的明显定义快,即:#定义最小值(x,y)((y)^((x)^(y))和-((x)<(y)))
定义最小值(x,y)((x)<(y)?(x):(y))#define MIN(x, y) ((x) < (y) ? (x) : (y))
是1(x
为-1-(x
是((x^y)和-(x
,这是((x^y)和-1)
,因为(x^y)
,因为-1都是“1”位(anything&-1)==anything
是y^(x^y)
,因为XOR是可交换的,而y的值被抵消x
为0(x
为0-(x
是((x^y)和-(x
,这是((x^y)和0)
,因为0
,因为0都是“0”位(任何东西&0)==0
是y^0
y
当前扩展为MIN(2,3)*4
,计算结果为7,而不是正确的8,因为乘法在最后的XOR之前完成。出于同样的原因,最好在每个参数替换前后加上括号:(3)^((2^3)和-(2<3))*4
#define MIN(x, y) ((y) ^ (((x) ^ (y)) & -((x) < (y))))
只有当平台使用整数时,宏仍然有效,并且它可能不会比MIN的明显定义快,即:#定义最小值(x,y)((y)^((x)^(y))和-((x)<(y)))
定义最小值(x,y)((x)<#define MIN(x, y) ((x) < (y) ? (x) : (y))