C ++使用11个字符代码交换两个数字

时间:2012-08-16 14:25:54

标签: c++ obfuscation

我的朋友给我发了一个他不能做的练习:
(C ++)

int main()
{
    unsigned int x = 0xB0FF14a5;
    unsigned int y = 0x7340c00e;
    // enter code here
    if(x==0x7340c00e && y==0xB0FF14a5) victory();
    return 0;
}

主要目标是运行victory()功能 假设:
-max 11个字符
- 你不能使用:“主”,“胜利”,“asm”,“&”,“*”,“(”,“/”
- 您只能使用一个分号

我尝试了#define和其他一些东西,但没有(我不是C ++大师):/
我不知道如何解决这个问题;谢谢你的帮助!

4 个答案:

答案 0 :(得分:12)

使用XOR swap algorithm

x^=y^=x^=y;

这相当于(通常见下文):

          //x==A,   y==B
x ^= y;   //x==A^B, y==B
y ^= x;   //x==A^B, y==A
x ^= y;   //x==B,   y==A

它的工作原理是因为两次相同的XORing可以得到原始数字。

在C ++ 03中,单表达式版本是未定义的行为,因此可能无法在所有编译器/平台上正常工作。这是因为修改和使用变量之间没有序列点。

在C ++ 11中,它定义明确。标准说(5.17.1):

  

在所有情况下,赋值在右和左操作数的值计算之后,以及赋值表达式的值计算之前进行排序。

答案 1 :(得分:8)

未定义的行为,但在我的计算机上运行:

x^=y^=x^=y;

更新:显然,这是自2011年以来的明确定义;看到interjay的答案。

答案 2 :(得分:4)

13个字符并且违反了其他规则,但完成工作并且太可爱了不发布:

#include<iostream>

void victory()
{
   std::cout << "Yes we can\n";
}

int main()
{
    unsigned int x = 0xB0FF14a5;
    unsigned int y = 0x7340c00e;
    #define if(x)
    if(x==0x7340c00e && y==0xB0FF14a5) victory();
    return 0;
}

Ideone

上的输出

答案 3 :(得分:1)

看看这个算法:XOR swap algorithm 但是你会得到一个编译警告,如:

warning: operation on ‘x’ may be undefined

如果您只在一行中使用此算法

x ^= y ^= x ^= y;