2.9 位运算符

位操作:C语言支持位操作符,如位与、位或、位异或等。这些操作符允许你直接操作二进制位,用于位掩码、位集合等应用。这在处理硬件寄存器、图形编程和密码学等领域非常有用。

Bitwise Operators(位操作符):

  • & : Bitwise AND(位与)

  • | : Bitwise OR(位或)

  • ^ : Bitwise XOR(位异或)

  • ~ : Bitwise NOT(位非)

  • << : Left shift(左移)

  • >> : Right shift(右移)

关于位运算,要在实际的例子中感悟,以下提供一个小例子:

Bitwise operators:Bitwise AND(位与)

2.9.1 bitwise.c
#include <stdio.h>

int main() {
    // Bitwise operators 位操作
    unsigned int a = 0b1010; // 10的二进制表示
    unsigned int b = 0b1100; // 12的二进制表示
    unsigned int result = a & b; // 按位与操作,结果为0b1000 (8)
    printf("result = %d\n", result);
    
return 0;
}

在上面的代码中,& 是按位与操作符,用于执行两个整数之间的按位与操作。它将两个整数的每一位进行比较,并在结果中设置一个位,只有在相应的位在两个操作数中都是1时才会设置。具体来说:

  • unsigned int a = 0b1010; 将二进制数 0b1010 赋值给变量 a,这表示 a 的二进制值为 1010,对应十进制数值为 10。

  • unsigned int b = 0b1100; 将二进制数 0b1100 赋值给变量 b,这表示 b 的二进制值为 1100,对应十进制数值为 12。

  • unsigned int result = a & b; 执行按位与操作,它会将 ab 的每个对应位进行比较,并将结果存储在变量 result 中。按位与操作的规则如下:

    • 0 & 0 等于 0

    • 0 & 1 等于 0

    • 1 & 0 等于 0

    • 1 & 1 等于 1

因此,在这个例子中,ab 的二进制值分别是 10101100,按位与操作将它们的对应位进行比较,结果是 1000,对应十进制数值为 8。所以,result 的值是 0b1000 或十进制值 8,这是按位与操作的结果。这个操作常用于位掩码、清除特定位的标志等操作。

总之,位运算有很多技巧,我目前遇到的也就下面这个例子,更多的例子需要你阅读更多,在更多的案例中感悟、练习和思考。

2.9.2 bitcount.c
#include <stdio.h>

int bitcount(unsigned int x)
{
    int count = 0;
    for (count = 0; x != 0; x >>= 1)
    {
        if (x & 01)
        {
            count++;
        }
    }

    // while (x) {

    //     count += x & 1;

    //     x >>= 1;
    // }

    return count;
}

int main()
{
    unsigned int num = 13; // Example input

    // Call the bitcount function and print the result
    printf("Number of set bits in %u: %d\n", num, bitcount(num));

    return 0;
}

这段代码是一个用于计算整数 x 中二进制表示中 1 的个数的循环。首先,变量 count 被初始化为 0,用于存储 x 中 1 的个数。然后,开始一个 for 循环,循环的条件是 x 不等于 0。在每次循环迭代中,x 都会被右移一位,这是通过 x >>= 1 实现的。这个操作会将 x 的二进制表示中的所有位向右移动一位,最左边的位将被丢弃,最右边的位将被填充为 0。

在循环体中,使用了一个 if 语句来检查 x 的最低位是否为 1。这是通过 x & 01 实现的,这个操作会将 x 的二进制表示和 01 进行按位与操作,如果 x 的最低位为 1,那么结果就是 1,否则结果就是 0。如果 x 的最低位为 1,那么 count 就会增加 1。这个循环会一直执行,直到 x 变为 0。这时,count 的值就是 x 的二进制表示中 1 的个数。


Number of set bits in 13: 3

例如,如果 x 的初始值为 13(在二进制中表示为 1101),那么这个循环会计算出 x 中 1 的个数为 3。

x >>= 1

这段代码 x >>= 1 是一个位运算符的使用,它表示将 x 的所有位向右移动一位。

在 C 语言中,>>= 是一个复合赋值运算符,它将右操作数的值(在这里是1)应用到左操作数(在这里是 x)上,并将结果赋值给左操作数。在这个例子中,>> 是右移位运算符,它将 x 的所有位向右移动指定的位数,在这里是一位。

x & 01

这段代码 x & 01 是一个位运算符的使用,它表示将 x 的二进制表示与 01 进行按位与操作。

在 C 语言中,& 是按位与运算符,它将两个操作数的每一位进行逻辑与操作。如果两个相应的二进制位都为1,则结果为1,否则为0。

在这个例子中,01 是一个二进制数,只有最低位为1,其他位都为0。因此,x & 01 的结果就是 x 的最低位。如果 x 的最低位为1,那么结果就是1,否则结果就是0。

这个操作在处理二进制数据时非常有用,例如在检查一个数的奇偶性、获取一个数的某一位或者清除一个数的某一位等情况中。

Exercise 2-9. In a two's complement number system, x =& (x-1) deletes the rightmost 1-bit in x. Explain why. Use this observation to write a faster ver- sion of bitcount.

Last updated