如果我想翻转一些内容,我想知道哪种方式更好。我应该使用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
答案 0 :(得分:10)
使用~
:
int
在所有平台上都不是32位。f
太少或太多的风险。答案 1 :(得分:4)
正如您要求c++一样,只需使用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>
实际上指定了应该操作的位数,因此它可以很好地解决这些问题。