如何在C中翻转一个字节中的特定位?

Nie*_*ben 20 c bit-manipulation bit

我正在尝试使用掩码并操作一个字节中的特定位.例如:

我想用C编写一个程序,在特定位置翻转两位,例如位置0的位和第三位的位.所以11100011,会变成01110011.

我怎么能交换这些位?

das*_*ght 24

通过使用掩码进行异或来完成翻转:在要翻转的位置设置位,然后执行XOR,如下所示:

int mask = 0x90; // 10010000
int num  = 0xE3; // 11100011
num ^= mask;     // 01110011
Run Code Online (Sandbox Code Playgroud)

以下是一些注意事项:

  1. 位通常从最低有效位置开始计数,因此您的示例将在位置4和7中翻转位,而不是在位置0和4处翻转位
  2. 要为单个位置构造位掩码,请使用expression 1 << n,其中n是从最低有效位开始计数的位置编号.
  3. 要在单个掩码中组合多个位,请使用|运算符.例如,(1 << 4) | (1 << 7)构造用于翻转位4和7的掩码.


Eut*_*rpy 6

如果你的字节是 x,并且你想交换第 i 和 j 个位置的位:

x = x ^ ((1<<i) | (1<<j));
Run Code Online (Sandbox Code Playgroud)

所以,在你的情况下,它只是 (1<<4) | (1<<7)。:)