亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 语言位运算符精通:与、或、异或、移位、取反全解析

什么是位运算符?

位运算符操作整数值的单个比特位。不同于作用于整数的算术运算符,位运算符作用于二进制表示,适合标志位、掩码、底层设备控制等性能关键任务。

C 语言提供以下位运算符:

运算符含义
&按位与
|按位或
^按位异或
~按位非(一补数)
<<左移
>>右移

位运算符仅定义于整型;不适用于 float、double 等浮点类型。

运算从最低有效位(LSB)向最高有效位(MSB)进行。下表汇总二元运算真值表:

操作数 x操作数 yx & yx | yx ^ y
00000
01011
10011
11110

以下逐一深入各运算符并附示例。

按位与(&)

仅当两对应位均为 1 时结果为 1,否则 0。常用于掩码屏蔽不需要的位。

Op1 = 0000 1101
Op2 = 0001 1001
Result = 0000 1001

按位或(|)

只要对应位有一个为 1 结果即为 1。常用于设置特定位。

Op1 = 0000 1101
Op2 = 0001 1001
Result = 0001 1101

按位异或(^)

对应位不同时结果为 1。适合翻转特定位。

Op1 = 0000 1101
Op2 = 0001 1001
Result = 0001 0100

示例程序:

#include <stdio.h>
int main() {
    int a = 20; /* 20 = 010100 */
    int b = 21; /* 21 = 010101 */
    int c = 0;
    c = a & b; /* 20 = 010100 */
    printf("AND - c = %d\n", c);
    c = a | b; /* 21 = 010101 */
    printf("OR - c = %d\n", c);
    c = a ^ b; /* 1 = 000001 */
    printf("XOR - c = %d\n", c);
    return 0;
}

输出:

AND - c = 20
OR - c = 21
XOR - c = 1

移位运算符(<< 和 >>)

移位运算符按指定位数左/右移动比特位。

以 4 位数 1111 为例:

x << 2 → 1100
x >> 2 → 0011

程序演示:

#include <stdio.h>
int main() {
    int a = 20; /* 20 = 010100 */
    int c = 0;
    c = a << 2; /* 80 = 101000 */
    printf("Left shift - c = %d\n", c);
    c = a >> 2; /* 5 = 000101 */
    printf("Right shift - c = %d\n", c);
    return 0;
}

输出:

Left shift - c = 80
Right shift - c = 5

按位取反(~)

取反运算符翻转每一位:1 变 0,0 变 1。是作用于单操作数的一元运算符。

0000 1111 → 1111 0000

示例程序:

#include <stdio.h>
int main() {
    int a = 10; /* 10 = 001010 */
    int c = ~a; /* 补码表示为 -11 */
    printf("Complement - c = %d\n", c);
    return 0;
}

输出:

Complement - c = -11

所有运算符综合演示

下面简洁程序演示所有位运算符:

#include <stdio.h>
int main() {
    unsigned int x = 48; /* 0011 0000 */
    unsigned int y = 13; /* 0000 1101 */
    int z = 0;
    z = x & y; /* 0 = 0000 0000 */
    printf("AND - x & y = %d\n", z);
    z = x | y; /* 61 = 0011 1101 */
    printf("OR - x | y = %d\n", z);
    z = x ^ y; /* 61 = 0011 1101 */
    printf("XOR - x ^ y = %d\n", z);
    z = ~x; /* -49 = 1111 0100 (补码) */
    printf("NOT - ~x = %d\n", z);
    z = x << 2; /* 192 = 1100 0000 */
    printf("Left shift - x << 2 = %d\n", z);
    z = x >> 2; /* 12 = 0000 1100 */
    printf("Right shift - x >> 2 = %d\n", z);
    return 0;
}

结果:

AND - x & y = 0
OR - x | y = 61
XOR - x ^ y = 61
NOT - ~x = -49
Left shift - x << 2 = 192
Right shift - x >> 2 = 12

核心要点

C语言

  1. 物联网与区块链:数据信任与效率的范式转移
  2. C# 类与对象:面向对象编程的基石
  3. 掌握 C# 抽象类与抽象方法:实战指南
  4. 理解 C# 分部类与分部方法
  5. 掌握 C# sealed 类与方法:用法、示例与代码安全性能提升
  6. 掌握 C++ 运算符:六大类型全解析与实战示例
  7. C 语言关键字与标识符完全指南
  8. C 语言运算符完全指南:算术、关系、逻辑、位运算等
  9. C++ 运算符全解析:类型、示例与示例程序
  10. C 语言常量与字面量完全指南:类型、用法与最佳实践
  11. C 语言运算符大全:算术、关系、逻辑、位运算、赋值与优先级详解
  12. Python 运算符完全指南:算术、逻辑、比较、赋值、位运算与优先级