📜  按位和(或&)范围(1)

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

按位和(或&)范围

在程序中,按位和(&)和按位或(|)是常用的位运算操作。按位和是将两个操作数的每个对应二进制位相乘,而按位或是将每个二进制位相加。这两个操作都非常有用,因为它们允许您检查某个二进制位是否打开,或者组合多个标志。

按位和(&)

按位和操作使用“&”运算符。如果两个操作数的对应位都为1,则结果中的该位为1,否则为0。

例如,下面是一个示例程序,演示如何使用按位和操作检查某个二进制位是否打开:

int main()
{
    unsigned char flags = 0b00001100; // flags = 0x0C

    if (flags & 0b00001000)
    {
        printf("Bit 3 is set!\n");
    }
    else
    {
        printf("Bit 3 is not set.\n");
    }

    return 0;
}

这个程序中,我们首先定义了一个名为“flags”的无符号字符变量,并将其设置为0b00001100,这意味着二进制表示法中的8位数1100,或十六进制C。然后我们使用&操作符和0b00001000进行按位操作,这是一个只有第3位打开的二进制数。结果,我们的“if”语句将检查二进制的第3位是否为“1”,如果是,则输出一条消息。

按位或(|)

按位或操作使用“|”运算符。如果两个操作数的对应位中有一个或两个都是1,则结果中的该位为1,否则为0。

例如,下面是一个示例程序,演示如何使用按位或操作设置某个二进制位:

int main()
{
    unsigned char flags = 0b00000100; // flags = 0x04

    flags |= 0b00001000;

    if (flags & 0b00001000)
    {
        printf("Bit 3 is set!\n");
    }
    else
    {
        printf("Bit 3 is not set.\n");
    }

    return 0;
}

这个程序中,我们首先定义了一个名为“flags”的无符号字符变量,并将其设置为0b00000100,这意味着二进制表示法中的8位数0100,或十六进制4。然后我们使用“|=”运算符和0b00001000进行按位或操作,这是一个只有第3位打开的二进制数。结果,我们的“if”语句将检查二进制的第3位是否为“1”,如果是,则输出一条消息。

按位和(&)和按位或(|)范围

除了单个二进制位外,按位和操作和按位或操作还允许您在位范围内执行操作。例如,您可能只想将某个字节中的前四个位设置为特定值,而不影响其余四个位。为此,您可以使用按位和和按位或操作进行范围切割。

下面是一个示例程序,演示如何使用按位和和按位或操作在位范围内设置值:

int main()
{
    unsigned char flags = 0b00001000; // flags = 0x08

    flags &= 0b11110000; // clear bits 0-3
    flags |= 0b00000101; // set bits 0 and 2

    printf("Flags: 0x%02X\n", flags);

    return 0;
}

这个程序中,我们首先定义了一个名为“flags”的无符号字符变量,并将其设置为0b00001000,这意味着二进制表示法中的8位数1000,或十六进制8。然后我们使用“&=0b11110000”进行按位和操作,并将其设置为0b11110000,这是一个具有前四个位设置为“1”,后四个位设置为“0”的二进制数。因为它是一个“&=”操作,所以只会影响前四个位。最后,我们使用“|=”运算符和0b00000101进行按位或操作,这是一个只有第0和第2位打开的二进制数。结果,我们的printf语句打印出二进制0b00001001,或十六进制9。

这是按位和和按位或操作的一个非常基础的例子,但它们非常有用,因为它们允许您在二进制级别上执行操作,这是其他操作无法完成的。