Попробуйте:
x ^= 0x14;
Это переключает оба бита. Это немного неясно, поскольку вы сначала упоминаете swap, а затем приводите пример переключения. В любом случае, чтобы поменять местами:
x = precomputed_lookup [x];
, где precomputed_lookup - 256-байтовый массив, может быть самым быстрым способом, это зависит от скорости памяти относительно скорости процессора. В противном случае это:
x = (x & ~0x14) | ((x & 0x10) >> 2) | ((x & 0x04) << 2);
РЕДАКТИРОВАТЬ: Еще немного информации о переключении битов.
Когда вы xor (^
) два целочисленных значения вместе, xor выполняется на уровне битов, например:
for each (bit in value 1 and value 2)
result bit = value 1 bit xor value 2 bit
так что бит 0 первого значения xor'ed с битом 0 второго значения, бит 1 с битом 1 и так далее. Операция xor не влияет на другие биты в значении. По сути, это параллельный бит xor во многих битах.
Глядя на таблицу истинности для xor, вы увидите, что бит xor со значением '1' эффективно переключает бит.
a b a^b
0 0 0
0 1 1
1 0 1
1 1 0
Итак, чтобы переключать биты 1 и 3, запишите двоичное число, в котором вы хотите, чтобы бит переключался, и ноль, где вы хотите оставить значение без изменений:
00001010
преобразовать в гекс: 0x0a. Вы можете переключать столько битов, сколько хотите:
0x39 = 00111001
переключит биты 0, 3, 4 и 5