4

如果我想翻转一些位,我想知道哪种方式更好。我应该使用XOR 0xffffffff还是使用翻转它们~

恐怕在某些情况下,我可能需要以其中一种方式而不是另一种方式将位填充到末端,这将使另一种方式使用起来更安全。我想知道是否有时使用一个比另一个更好。

这是一些在相同输入值上使用两者的代码,并且输出值始终相同。

#include <iostream>
#include <iomanip>

void flipBits(unsigned long value)
{
    const unsigned long ORIGINAL_VALUE = value;
    std::cout << "Original value:" << std::setw(19) << std::hex << value << std::endl;

    value ^= 0xffffffff;
    std::cout << "Value after XOR:" << std::setw(18) << std::hex << value << std::endl;

    value = ORIGINAL_VALUE;
    value = ~value;
    std::cout << "Value after bit negation: " << std::setw(8) << std::hex << value << std::endl << std::endl;
}

int main()
{
    flipBits(0x12345678);
    flipBits(0x11223344);
    flipBits(0xabcdef12);
    flipBits(15);
    flipBits(0xffffffff);
    flipBits(0x0);
    return 0;
}

输出:

Original value:           12345678
Value after XOR:          edcba987
Value after bit negation: edcba987

Original value:           11223344
Value after XOR:          eeddccbb
Value after bit negation: eeddccbb

Original value:           abcdef12
Value after XOR:          543210ed
Value after bit negation: 543210ed

Original value:                  f
Value after XOR:          fffffff0
Value after bit negation: fffffff0

Original value:           ffffffff
Value after XOR:                 0
Value after bit negation:        0

Original value:                  0
Value after XOR:          ffffffff
Value after bit negation: ffffffff
4

2 回答 2

13

使用~

  • 您不会依赖该类型的任何特定宽度;例如,int并非在所有平台上都是 32 位。
  • 它消除了意外键入一个f太少或太多的风险。
  • 它使意图更加清晰。
于 2014-09-26T17:50:26.640 回答
4

当您特别要求时,只需使用std::bitset

#include <iostream>
#include <iomanip>
#include <bitset>
#include <limits>

void flipBits(unsigned long value) {
    std::bitset<std::numeric_limits<unsigned long>::digits> bits(value);
    std::cout << "Original value : 0x" << std::hex << value;

    value = bits.flip().to_ulong();
    std::cout << ", Value after flip: 0x" << std::hex << value << std::endl;
}

现场演示

至于您提到的问题,仅使用~带有unsigned long值的运算符,并根据实际需要翻转更多位:
由于std::bitset<NumberOfBits>实际指定了应该操作的位数,因此它将很好地解决此类问题。

于 2014-09-26T18:14:00.267 回答