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

如何在C中翻转字节中的特定位?,c,bit-manipulation,bit,C,Bit Manipulation,Bit,我试图使用掩码并在一个字节中处理特定的位。 例如: 我想用C编写一个程序,在特定位置翻转两个位,例如位置0的位和第三位置的位。 因此,11100011,将成为011110011 如何交换这些位?翻转位是通过使用掩码进行异或:在要翻转的位置设置位,然后执行异或,如下所示: int mask = 0x90; // 10010000 int num = 0xE3; // 11100011 num ^= mask; // 01110011 以下是一些注意事项: 位通常从最低有效位置开始计数,

我试图使用掩码并在一个字节中处理特定的位。 例如:

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


如何交换这些位?

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

int mask = 0x90; // 10010000
int num  = 0xE3; // 11100011
num ^= mask;     // 01110011
以下是一些注意事项:

  • 位通常从最低有效位置开始计数,因此您的示例翻转位置4和7的位,而不是位置0和4的位

  • 要为单个位置构造位掩码,请使用表达式
    1首先,祝您好运

    一句话——从右边而不是左边对位进行计数更有用,因为有各种字节/字大小(8位、16位等),这种计数可以更好地保持兼容性。因此,在您的例子中,您指的是位7和位4(零计数)

    你的意思是“翻转”(改变01位)还是“切换”它们


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

    要翻转位,可以使用异或按位运算符。这需要两个操作数(通常是要操作的值和定义将翻转哪些位的掩码)。只有当且仅当两个运算符中的一个设置为1,而不是两个都设置为1时,异或(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;
    }
    
    #包括
    int main(int argc,字符**argv)
    {
    int num=7;//00000111
    int mask=3;//00000011
    int result=num^mask;//00000100
    printf(“结果=%d\n”,result);//应该是4
    返回0;
    }
    
    如果您的字节是x,并且希望在第i位和第j位位置切换位:

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

    x=x^((1你会得到这个问题的具体答案,但谷歌布尔代数和真值表。谢谢你!我是说切换!很乐意帮忙!顺便说一句,“投票”好答案是表达你感激的好方法;-)