C语言知识1(位运算符)

什么是位运算符:

位运算是直接对整型数据的二进制进行运算。

1.按位与(&)

将参加运算的两个数据,按二进制位进行"与"运算。两个都是一则为一

举例: 3 & 5

3 => 0000 0000 0000 0011

5 => 0000 0000 0000 0101

&    0000 0000 0000 0001 转换成十进制也就是1

以下是一个示例代码,演示了如何在C语言中使用位与运算符进行按位与操作:

#include <stdio.h>

int main() {
    unsigned int a = 0b10101010; // 第一个操作数
    unsigned int b = 0b11001100; // 第二个操作数
    unsigned int result; // 按位与结果

    // 使用位与运算符进行按位与操作
    result = a & b;

    printf("a & b = 0x%02X\n", result);

    return 0;
}

输出结果为:

a & b = 0x80

在这个示例中,a的二进制表示为10101010,b的二进制表示为11001100。通过位与操作,两个二进制数的对应位分别进行按位与操作,得到的结果是10000000,即0x80

注意,按位与操作符(&)在两个整型操作数上执行按位运算,并且按照它们的二进制表示进行操作。

2.按位或(|)

将参加运算的两个数据,按二进制位进行"或"运算。两个中有一个是一则为一

举例: 3 | 5

3 => 0000 0000 0000 0011

5 => 0000 0000 0000 0101

|    0000 0000 0000 0111 转换成十进制也就是7

以下是一个示例代码,演示了如何在C语言中使用位或运算符进行按位或操作:

#include <stdio.h>

int main() {
    unsigned int a = 0b10101010; // 第一个操作数
    unsigned int b = 0b11001100; // 第二个操作数
    unsigned int result; // 按位或结果

    // 使用位或运算符进行按位或操作
    result = a | b;

    printf("a | b = 0x%02X\n", result);

    return 0;
}

输出结果为:

a | b = 0xFE

在这个示例中,a的二进制表示为10101010,b的二进制表示为11001100。通过位或操作,两个二进制数的对应位分别进行按位或操作,得到的结果是11111110,即0xFE。

注意,按位或操作符(|)在两个整型操作数上执行按位运算,并且按照它们的二进制表示进行操作。

3.按位取反(~)

将数据,按二进制位进行"取反"运算。零变成一,一变成零

举例: ~6

6 => 0000 0000 0000 0110

~    1111 1111 1111 1010 转换成十进制也就是-7

以下是一个示例代码,演示了如何在C语言中使用按位取反操作符进行按位取反:

#include <stdio.h>

int main() {
    unsigned int a = 0b10101010; // 操作数
    unsigned int result; // 按位取反结果

    // 使用按位取反操作符进行按位取反
    result = ~a;

    printf("~a = 0x%02X\n", result);

    return 0;
}

输出结果为:

~a = 0x55

在这个示例中,a的二进制表示为10101010。通过按位取反操作,每个二进制位从0变为1,从1变为0,得到的结果是01010101,即0x55

注意,按位取反操作符(~)在一个整型操作数上执行按位运算,并且按照它的二进制表示进行操作。对于有符号整型数据,按位取反操作符会将其进行补码取反

4.异或(^)

将参加运算的两个数据,按二进制位进行"与"运算。相同为零,不同为一

举例: 3 ^ 5

3 => 0000 0000 0000 0011

5 => 0000 0000 0000 0101

^    0000 0000 0000 0110 转换成十进制也就是6

以下是一个示例代码,演示了如何在C语言中使用位异或运算符进行按位异或操作:

#include <stdio.h>

int main() {
    unsigned int a = 0b10101010; // 第一个操作数
    unsigned int b = 0b11001100; // 第二个操作数
    unsigned int result; // 按位异或结果

    // 使用位异或运算符进行按位异或操作
    result = a ^ b;

    printf("a ^ b = 0x%02X\n", result);

    return 0;
}

输出结果为:

a ^ b = 0x5A

在这个示例中,a的二进制表示为10101010,b的二进制表示为11001100。通过位异或操作,两个二进制数的对应位分别进行按位异或操作,得到的结果是01011010,即0x5A

注意,按位异或操作符(^)在两个整型操作数上执行按位运算,并且按照它们的二进制表示进行操作。

5.同或

将参加运算的两个数据,按二进制位进行"同或"运算。相同为一,不同为零

举例: 3 同或 5

3 => 0000 0000 0000 0011

5 => 0000 0000 0000 0101

     1111 1111 1111 0001 转换成十进制也就是-7

下面是一个示例代码,演示了如何使用按位异或和逻辑非运算符实现按位同或操作:

#include <stdio.h>

int main() {
    unsigned int a = 0b10101010; // 第一个操作数
    unsigned int b = 0b11001100; // 第二个操作数
    unsigned int xnor; // 按位同或结果

    // 使用按位异或和逻辑非运算符实现按位同或操作
    xnor = ~(a ^ b);

    printf("a ^ b = 0x%02X\n", xnor);

    return 0;
}

输出结果为:

a ^ b = 0x33

在这个示例中,a的二进制表示为10101010,b的二进制表示为11001100。通过按位异或操作,得到的结果是01100110。然后,使用逻辑非运算符将结果取反,得到最终的按位同或结果为00110011,即0x33

6.左移(<<)

<< : 在一定范围内,每向左移 1 位,就相当于 * 2;

举例: 3 << 5

3 => 0000 0000 0000 0011

<<   0000 0000 0110 0000  转换成十进制也就是 96 = 3  *  (2^5) (这里的^代表几次方 不是异或)

以下是一个示例代码,演示了如何在C语言中使用左移位运算符进行左移操作:

#include <stdio.h>

int main() {
    unsigned int num = 0b10100101; // 要进行左移操作的数
    int shift = 3; // 左移的位数
    unsigned int result; // 左移后的结果

    // 使用左移位运算符进行左移操作
    result = num << shift;

    printf("num << %d = 0x%02X\n", shift, result);

    return 0;
}

输出结果为:

num << 3 = 0x50

在这个示例中,num的二进制表示为10100101。通过将num向左移动3位,即使用左移位运算符(<<)将num左移3位,得到的结果是01010000,即0x50

注意,左移操作符(<<)在一个整型操作数上执行按位运算,并且按照它们的二进制表示进行操作。左移的位数表示要将数值向左移动多少位。左移操作会在低位补0,因此左移操作会使得数值变大。

面试题:最高效的计算 2 * 8?

2 << 3 / 8 << 1

7.右移(>>)

>> : 在一定范围内,每向右移 1 位,就相当于 / 2;

举例: 96 >> 5

96 => 0000 0000 0110 0000

<<    0000 0000 0000 0011  转换成十进制也就是 3 = 96  /  (2^5)

以下是一个示例代码,演示了如何在C语言中使用右移位运算符进行右移操作:

#include <stdio.h>

int main() {
    int num = 0b10100101; // 要进行右移操作的数
    int shift = 3; // 右移的位数
    int result; // 右移后的结果

    // 使用右移位运算符进行右移操作
    result = num >> shift;

    printf("num >> %d = 0x%02X\n", shift, result);

    return 0;
}

输出结果为:

num >> 3 = 0x14

在这个示例中,num的二进制表示为**10100101**。通过将num向右移动3位,即使用右移位运算符(>>)将num右移3位,得到的结果是00010100,即0x14

注意,对于有符号整数类型,右移操作会保留符号位并根据符号位填充高位。而对于无符号整数类型,右移操作会简单地在高位补0。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值