使用XOR 0xffffffff或〜在C ++中翻转位?

时间:2014-09-26 17:46:10

标签: c++ bit-manipulation xor negation

如果我想翻转一些内容,我想知道哪种方式更好。我应该使用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

2 个答案:

答案 0 :(得分:10)

使用~

  • 您不会依赖任何特定宽度的类型;例如,int在所有平台上都不是32位。
  • 它消除了意外键入一个f太少或太多的风险。
  • 它使意图更清晰。

答案 1 :(得分: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;
}

请参阅live demo

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