mr_*_*air 35 c c++ swap objective-c
此公式交换两个数字而没有临时变量,但使用算术运算:
a = (a+b) - (b=a);
Run Code Online (Sandbox Code Playgroud)
没有算术运算我该怎么办?我在想XOR.
小智 22
a=a+b;
b=a-b;
a=a-b;
Run Code Online (Sandbox Code Playgroud)
这很简单但有效....
BiG*_*YaN 20
在C中这应该工作:
a = a^b;
b = a^b;
a = a^b;
Run Code Online (Sandbox Code Playgroud)
或者看起来更冷静/更好看:
a^=b;
b^=a;
a^=b;
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请查看此内容.XOR是一个非常强大的操作,有许多有趣的用法在这里和那里出现.
Mar*_*ork 19
为什么不使用std libs?
std::swap(a,b);
Run Code Online (Sandbox Code Playgroud)
Mat*_*ery 15
在不使用任何临时存储或算术运算的情况下交换两个数字的最佳方法是将两个变量加载到寄存器中,然后以相反的方式使用寄存器!
你不能直接从C那样做,但是编译器可能很有能力为你解决(至少,如果启用了优化) - 如果你编写简单明了的代码,比如KennyTM在他的评论中建议的代码.
例如
void swap_tmp(unsigned int *p)
{
unsigned int tmp;
tmp = p[0];
p[0] = p[1];
p[1] = tmp;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc 4.3.2编译并使用-O2
优化标志给出:
swap_tmp:
pushl %ebp ; (prologue)
movl %esp, %ebp ; (prologue)
movl 8(%ebp), %eax ; EAX = p
movl (%eax), %ecx ; ECX = p[0]
movl 4(%eax), %edx ; EDX = p[1]
movl %ecx, 4(%eax) ; p[1] = ECX
movl %edx, (%eax) ; p[0] = EDX
popl %ebp ; (epilogue)
ret ; (epilogue)
Run Code Online (Sandbox Code Playgroud)
我之前没有见过这个C解决方案,但我确信有人已经想到了它.并且可能比我更多地发布自我控制权.
fprintf(fopen("temp.txt", "w"), "%d", a);
a = b;
fscanf(fopen("temp.txt", "r"), "%d", &b);
Run Code Online (Sandbox Code Playgroud)
没有额外的变数!
它适用于我,但根据stdio实现,您可能需要做一些关于输出缓冲的事情.
使用XOR,
void swap(int &a, int &b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
Run Code Online (Sandbox Code Playgroud)
一个带有XOR的衬里
void swap(int &a, int &b)
{
a ^= b ^= a ^= b;
}
Run Code Online (Sandbox Code Playgroud)
这些方法看起来很干净,因为它们不会在任何测试用例中失败,但是又一次,因为(在方法2中)变量的值在同一序列点内被修改了两次,因此据说它具有由声明的未定义行为ANSIC。
归档时间: |
|
查看次数: |
56085 次 |
最近记录: |