说实话,我不确定这段代码是否好。它有一股难闻的气味。具体来说,就是这个函数:
unsigned int i4_xor ( unsigned int i, unsigned int j )
{
unsigned int i2;
unsigned int j2;
unsigned int k;
unsigned int l;
k = 0;
l = 1;
while ( i != 0 || j != 0 )
{
i2 = i / 2;
j2 = j / 2;
if (
( ( i == 2 * i2 ) && ( j != 2 * j2 ) ) ||
( ( i != 2 * i2 ) && ( j == 2 * j2 ) ) )
{
k = k + l;
}
i = i2;
j = j2;
l = 2 * l;
}
return k;
}
还有一个i8_xor。还有几个abs函数。
我认为应该在DailyWTF发布一篇文章。
编辑:对于非C程序员,这里有一个简短的指南,说明上述代码的作用:
function xor i:unsigned, j:unsigned
answer = 0
bit_position = 1
while i <> 0 or j <> 0
if least significant bit of i <> least significant bit of j
answer = answer + bit_position
end if
bit_position = bit_position * 2
i = i / 2
j = j / 2
end while
return answer
end function
为了确定最低有效位是设置还是清除,可以使用以下方法:
bit set if i <> (i / 2) * 2
bit clear if i == (i / 2) * 2
代码变得更加混乱的原因是C语言定义了一个异或运算符'^'。所以,代码可以写成:
result = i4_xor (a, b);
你可以拥有:
result = a ^ b; // no function call at all!
原始程序员应该知道异或运算符。即使他们不知道(并且可以理解,这是另一个混淆的C语言符号),他们对异或函数的实现非常糟糕。