Если я хочу перевернуть несколько кусочков, мне было интересно, какой путь лучше. Должен ли я перевернуть их, используя 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
использование ~
:
int
не 32 бит на всех платформах.f
слишком мало или слишком много.Как вы просите 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;
}
Увидеть живое демо.
Что касается ваших упомянутых проблем, просто с помощью ~
оператор с unsigned long
значение, и иметь больше битов, перевернутых, как на самом деле хотелось:
поскольку std::bitset<NumberOfBits>
фактически определяет количество битов, с которыми нужно работать, это правильно решит такие проблемы.