你犯了一个经典的错误,认为 C 中的行越少意味着代码越优化。
您应该真正检查汇编程序输出并分析您的代码,看看它是否是一个实际的瓶颈。
我倾向于做的是首先优化可读性,然后只有在它成为问题时才攻击性能。因此,一个更具可读性的解决方案(在我看来并不那么谦虚)是这样的:
unsigned int bit_swap (unsigned int num, unsigned int pos1, unsigned int pos2) {
// Swapping identical bit positions is a no-op.
if (pos1 == pos2)
return num;
// Get masks from bit positions.
unsigned int mask1 = 1 << pos1;
unsigned int mask2 = 1 << pos2;
// Get bit truth values.
int bit1_was_set = ((num & mask1) != 0);
int bit2_was_set = ((num & mask2) != 0);
// Clear and set first bit (set only if second bit was originally set).
num = num & ~mask1;
if (bit2_was_set)
num = num | mask1;
// Do the same for other bit.
num = num & ~mask2;
if (bit1_was_set)
num = num | mask2;
// Return the value with swapped bits.
return num;
}
尽管行数比您的方法多得多,但您很可能会发现现在可用的疯狂优化的编译器会在幕后为您提供类似的代码。
您几乎肯定会发现,非 C 专家(可能还有您自己,六个月后)将能够比单行多位运算符变体更好地理解您的源代码。