Hãy thử:
x ^= 0x14;
Đó Toggles cả hai bit. Đó là một chút không rõ ràng trong câu hỏi như bạn lần đầu tiên đề cập đến trao đổi và sau đó đưa ra một ví dụ chuyển đổi. Dù sao, để trao đổi các bit:
x = precomputed_lookup [x];
nơi precomputed_lookup là một mảng 256 byte, có thể là cách nhanh nhất, nó phụ thuộc vào tốc độ bộ nhớ tương đối so với tốc độ xử lý. Nếu không, đó là:
x = (x & ~0x14) | ((x & 0x10) >> 2) | ((x & 0x04) << 2);
EDIT: Một số thông tin khác về các bit chuyển đổi.
Khi bạn xor (^
) hai giá trị số nguyên với nhau, xor được thực hiện ở cấp độ bit, như thế này:
for each (bit in value 1 and value 2)
result bit = value 1 bit xor value 2 bit
để bit 0 của giá trị đầu tiên được xor'ed với bit 0 của giá trị thứ hai, bit 1 với bit 1 và vân vân. Thao tác xor không ảnh hưởng đến các bit khác trong giá trị. Trong thực tế, nó là một bit xor song song trên nhiều bit.
Nhìn vào bảng sự thật cho xor, bạn sẽ thấy rằng xor'ing một chút với giá trị '1' hiệu quả chuyển đổi bit.
a b a^b
0 0 0
0 1 1
1 0 1
1 1 0
Vì vậy, để chuyển các bit 1 và 3, hãy viết một số nhị phân với một trong những nơi bạn muốn các bit để chuyển đổi và một số không, nơi bạn muốn để lại giá trị không thay đổi:
00001010
convert tới hex: 0x0a. Bạn có thể chuyển đổi nhiều bit như bạn muốn:
0x39 = 00111001
sẽ chuyển bit 0, 3, 4 và 5
Wow ba câu trả lời giống hệt nhau với các số khác nhau - chúc bạn may mắn! – Benjol
Bạn đang cố gắng trao đổi hai bit, hoặc chuyển đổi các bit? Nghĩa là, 00 có trở thành 00 hay 11 không? –
Bạn có thể làm rõ "hoán đổi" không? Bạn có nghĩa là bit2 =! Bit2, và bit4 =! Bit4, hoặc bạn có nghĩa là bit2 = bit4 và bit4 = bit2? – Roddy