求大神解决下这么写的max和min函数,该怎么处理
求大神解决下这么写的max和min函数
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
int min(int a,int b)
{
return *( &b-(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
------解决方案--------------------
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
这个是很讨巧的方法,直接返回前一个地址的值还是后一个地址的值,也就是说,如果a>b,那么就会返回a地址对应的值
------解决方案--------------------
------解决方案--------------------
1.unsigned(a-b)>>(sizeof(int)*8-1) 等价为 a>=b?0:-1
2.函数入栈顺序为从右往左 b=*(&a-1)
3.不同的编译器可能第二条处理不同 所以。。
不推荐这样写,不过学习还是可以的!
------解决方案--------------------
我也来说说自己的见解吧
比如max这个:
首先 unsigned(a - b)可得到一个数,如果a > b,则最高位为0,如果a < b,最高位为1(负数),接着后面位移31为(sizeof(int) - 1),只留下了最高位,所以结果为0或者1
然后利用c语言函数压栈的规则,b的地址大于a得地址,如果a < b,则会+1移动到b,取出b的数据,如果a > b,则不移动,取a的值
------解决方案--------------------
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
这个是很讨巧的方法,直接返回前一个地址的值还是后一个地址的值,也就是说,如果a>b,那么就会返回a地址对应的值
这个正解,*就是取值的,里面有个&是取地址的!所以,直接……你懂得
------解决方案--------------------
对了,from Suse 10 /usr/include/linux/kernel.h
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
int min(int a,int b)
{
return *( &b-(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
------解决方案--------------------
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
这个是很讨巧的方法,直接返回前一个地址的值还是后一个地址的值,也就是说,如果a>b,那么就会返回a地址对应的值
------解决方案--------------------
------解决方案--------------------
1.unsigned(a-b)>>(sizeof(int)*8-1) 等价为 a>=b?0:-1
2.函数入栈顺序为从右往左 b=*(&a-1)
3.不同的编译器可能第二条处理不同 所以。。
不推荐这样写,不过学习还是可以的!
------解决方案--------------------
我也来说说自己的见解吧
比如max这个:
首先 unsigned(a - b)可得到一个数,如果a > b,则最高位为0,如果a < b,最高位为1(负数),接着后面位移31为(sizeof(int) - 1),只留下了最高位,所以结果为0或者1
然后利用c语言函数压栈的规则,b的地址大于a得地址,如果a < b,则会+1移动到b,取出b的数据,如果a > b,则不移动,取a的值
------解决方案--------------------
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
这个是很讨巧的方法,直接返回前一个地址的值还是后一个地址的值,也就是说,如果a>b,那么就会返回a地址对应的值
这个正解,*就是取值的,里面有个&是取地址的!所以,直接……你懂得
------解决方案--------------------
对了,from Suse 10 /usr/include/linux/kernel.h
- C/C++ code
# uname -r 2.6.16.46-0.12-smp # cat /etc/SuSE-release SUSE Linux Enterprise Server 10 (x86_64) VERSION = 10 PATCHLEVEL = 1