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

时间:2013-10-27 10:52:55

标签: c bit-manipulation bit

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

我想在C中编写一个程序,在特定位置翻转两位,例如位置0处的位和位于第三位置的位。 因此,11100011将成为01110011

如何交换这些位?

4 个答案:

答案 0 :(得分:23)

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

int mask = 0x90; // 10010000
int num  = 0xE3; // 11100011
num ^= mask;     // 01110011

以下是几点说明:

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

答案 1 :(得分:2)

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

x = x ^ ((1<<i) | (1<<j));

因此,在您的情况下,它只是(1 <&lt; 4)| (1 <<;&LT; 7)。 :)

答案 2 :(得分:1)

首先,祝你好运!

一句话 - 从右侧而不是左侧计算位数更有用,因为有各种字节/字大小(8位,16位等),并且该计数可以更好地保持兼容性。因此,在您的情况下,您指的是#7和#4位(零计数)。

你的意思是'翻转'(改变0&lt; - &gt; 1位)或者在一个和另一个之间“切换”它们吗?

对于第一个选项,上面的答案(XOR with“int mask = 0x90; // 10010000”)非常好。对于第二个,它有点棘手(但不多)。

答案 3 :(得分:1)

要翻转位,可以使用异或按位运算符。这需要两个操作数(通常,您要操作的值和定义将被翻转的位的掩码)。只有在两者中的一个设置为1但不是两者的情况下,eXclusive OR(XOR)运算符才会翻转一点。请参阅下面的(简单)示例:

#include <stdio.h>

int main(int argc, char** argv)
{
   int num = 7;   //00000111
   int mask = 3;  //00000011

   int result = num ^ mask; //00000100
   printf("result = %d\n", result); //should be 4

   return 0;
}