манипулирование битами — Отразить биты, используя XOR 0xffffffff или ~ в C ++?

Если я хочу перевернуть несколько кусочков, мне было интересно, какой путь лучше. Должен ли я перевернуть их, используя 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

3

Решение

использование ~:

  • Вы не будете полагаться на какую-либо конкретную ширину типа; например, int не 32 бит на всех платформах.
  • Это устраняет риск случайного ввода одного f слишком мало или слишком много.
  • Это делает намерение более ясным.
10

Другие решения

Как вы просите в частности, просто используйте 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> фактически определяет количество битов, с которыми нужно работать, это правильно решит такие проблемы.

4

По вопросам рекламы [email protected]