📜  在C中查找,设置,清除,切换和修改位(1)

📅  最后修改于: 2023-12-03 15:23:22.915000             🧑  作者: Mango

在C中操作位

在C语言中,常常需要对某个变量的二进制位进行操作,例如判断某些位是否被置位、设置某些位等。本文将介绍如何在C中进行位操作。

1. 查找位

要查找一个变量中的某个位是否被置位,可以使用“&”运算符。例如,下面的代码可以检查num的第3位是否被置位:

if (num & (1 << 3)) {
    /* 第3位被置位 */
} else {
    /* 第3位未被置位 */
}

解释一下上面的代码:左移运算符“<<”将“1”这个二进制数向左移动3位,变成了“00001000”,即第3位是1,其他位都是0。num & (1 << 3)的结果就是num与“00001000”进行按位与运算的结果,如果num的第3位也是1,那么结果就是一个非0数,if条件判断就成立,表示num的第3位被置位。

2. 设置位

如果要对一个变量的某个位进行设置,可以使用按位或运算符“|”和左移运算符“<<”。例如,下面的代码将num的第3位进行置位:

num |= (1 << 3);

解释一下上面的代码:(1 << 3)左移3位是“00001000”,即第3位是1,其他位都是0。num |= (1 << 3)就是将num和“00001000”进行按位或运算,并将结果赋值给num,这样就把num的第3位设置为了1。

3. 清除位

如果要对一个变量的某个位进行清除,可以使用按位与运算符“&”和按位取反运算符“~”。例如,下面的代码将num的第3位进行清除:

num &= ~(1 << 3);

解释一下上面的代码:(1 << 3)左移3位是“00001000”,即第3位是1,其他位都是0。~(1 << 3)的结果是“11110111”,即第3位是0,其他位都是1。num &= ~(1 << 3)就是将num和“11110111”进行按位与运算,并将结果赋值给num,这样就把num的第3位清除了。

4. 切换位

如果要对一个变量的某个位进行切换(如果已经置位则清除,如果未置位则置位),可以使用按位异或运算符“^”。例如,下面的代码将num的第3位进行切换:

num ^= (1 << 3);

解释一下上面的代码:(1 << 3)左移3位是“00001000”,即第3位是1,其他位都是0。num ^= (1 << 3)就是将num和“00001000”进行按位异或运算,并将结果赋值给num,这样就可以对num的第3位进行切换。

5. 修改位

有时候需要对一个变量的某些位进行修改,而不是简单地设置或清除,可以采用先清除再设置的方法。例如,下面的代码将num的第3位改为1:

num &= ~(1 << 3);  /* 先清除第3位 */
num |= (1 << 3);   /* 再设置第3位 */

解释一下上面的代码:(1 << 3)左移3位是“00001000”,即第3位是1,其他位都是0。num &= ~(1 << 3)就是将num和“11110111”进行按位与运算,清除num的第3位。然后,num |= (1 << 3)就是将num和“00001000”进行按位或运算,将num的第3位设置为1。

总结

通过本文的介绍,我们了解了如何在C语言中进行位操作。在进行位操作时,需要对二进制数、按位与、按位或、按位异或、左移和按位取反等概念有深入的理解。位操作可以让程序更加高效和简洁,但也需要谨慎使用,避免出现难以排查的错误。