C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World C - 编译过程 C - 注释 C - 标记 C - 关键字 C - 标识符 C - 用户输入 C - 基本语法 C - 数据类型 C - 变量 C - 整数提升 C - 类型转换 C - 类型转换 C - 布尔值

C 语言中的常量和文字

C - 常量 C - 字面量 C - 转义序列 C - 格式说明符

C 语言中的运算符

C - 运算符 C - 算术运算符 C - 关系运算符 C - 逻辑运算符 C - 位运算符 C - 赋值运算符 C - 一元运算符 C - 递增和递减运算符 C - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 C - 递归

C 语言中的作用域规则

C - 作用域规则 C - 静态变量 C - 全局变量

C 语言中的数组

C - 数组 C - 数组的属性 C - 多维数组 C - 将数组传递给函数 C - 从函数返回数组 C - 可变长度数组

C 语言中的指针

C - 指针 C - 指针和数组 C - 指针的应用 C - 指针运算 C - 指针数组 C - 指向指针的指针 C - 将指针传递给函数 C - 从函数返回指针 C - 函数指针 C - 指向数组的指针 C - 指向结构体的指针 C - 指针链 C - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


C 语言中的位运算符

C 语言中的位运算符允许对存储在计算机内存中的数据进行低级操作。

位运算符与 C 语言中的逻辑运算符不同。例如,逻辑与运算符 (&&) 对两个布尔表达式执行与运算,而位与运算符 (&) 对两个操作数的每个对应位执行与运算。

对于三个逻辑运算符 &&||!,C 语言中对应的位运算符分别为 &|~

此外,符号 ^(异或)、<<(左移)和>>(右移)是其他按位运算符。

运算符 描述 示例
& 二进制与运算符:如果两个操作数中都存在一位,则将一位复制到结果中。 (A & B)
| 二进制"或"运算符复制一个位,前提是该位存在于任一操作数中。 (A | B)
^ 二进制"异或"运算符复制一个位,前提是该位在一个操作数中被设置,但不是同时存在于两个操作数中。 (A ^ B)
~ 二进制"一的补码"运算符是一元运算符,具有"翻转"位的效果。 (~A)
<< 二进制左移运算符。左侧操作数的值按右侧操作数指定的位数向左移动。 A << 2
>> 二进制右移运算符。左侧操作数的值按右侧操作数指定的位数向右移动。 A >> 2

尽管这些运算符作用于单个位,但它们只需要 C 数据类型或变量形式的操作数,因为变量在内存中占用特定数量的字节。

C 语言中的按位与运算符 (&)

按位与运算符 (&) 的执行情况如下真值表所示 -

bit a bit b a & b
0 0 0
0 1 0
1 0 0
1 1 1

按位二进制与运算对二进制数字的每个位置上的位执行逻辑运算。

假设两个 int 变量"a"和"b"的值为 60(相当于二进制的 0011 1100)和 13(相当于二进制的 0000 1101),则"a & b"运算的结果为 13,如下所示,按位与运算其对应位。

  0011 1100  
& 0000 1101 
  --------- 
= 0000 1100 

二进制数 00001100 对应十进制的 12。

按位或 (|) 运算符

按位或 (|) 运算符的执行结果如下:

bit a bit b a | b
0 0 0
0 1 1
1 0 1
1 1 1

按位二进制或运算对二进制数字的每个位置上的位执行逻辑运算。

假设两个 int 变量"a"和"b"的值为 60(相当于二进制的 0011 1100)和 13(相当于二进制的 0000 1101),则"a | b"的结果为 61,如下所示,按照它们对应位的按位或运算 -

  0011 1100   
| 0000 1101  
  --------- 
= 0011 1101

二进制数 00111101 对应十进制数 61。

按位异或 (^) 运算符

按位异或 (^) 运算符的执行结果符合以下真值表 -

bit a bit b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0

按位二进制异或运算 (XOR) 对二进制数字的每个位置上的位执行逻辑运算。XOR 运算称为"排他或"。

注意:当且仅当其中一个操作数为 1 时,XOR 的结果才为 1。与或运算不同,如果两个位都为 1,则 XOR 的结果为 0。

假设两个 int 变量"a"和"b"的值为 60(相当于二进制的 0011 1100)和 13(相当于二进制的 0000 1101),则根据其对应位的按位异或运算,a ^ b 运算结果为 49,如下所示 -

  0011 1100   
^ 0000 1101  
  --------- 
= 0011 0001

二进制数 00110001 对应十进制的 49。

左移 (<<) 运算符

左移运算符用符号 << 表示。它将左侧操作数的每一位向左移动右侧操作数指定的位数。移动过程中产生的任何空格都用零填充。

假设 int 变量 "a" 的值为 60(相当于二进制的 0011 1100),则 "a << 2" 运算的结果为 240,具体结果如下所示,其对应位按位左移 −

0011 1100 << 2 = 1111 0000

二进制数 11110000 对应十进制的 240。

右移 (>>) 运算符

右移运算符用符号 >> 表示。它将左侧操作数的每一位向右移动右侧操作数指示的位数。移位过程中产生的任何空格都用零填充。

假设 int 变量 a 的值为 60(相当于二进制的 0011 1100),则"a >> 2"运算的结果为 15,具体操作如下所示,其对应位按位右移 −

0011 1100 >> 2 = 0000 1111

二进制数 00001111 对应十进制的 15。

1 的补码 (~) 运算符

C 语言中的 1 的补码运算符 (~) 是一元运算符,只需要一个操作数。它具有"翻转"位的效果,这意味着 1 被 0 替换,反之亦然。

a ~a
0 1
1 0

假设 int 变量 "a" 的值为 60(相当于二进制的 0011 1100),则 "~a" 运算的结果为二进制补码形式的 -61,具体操作如下:将对应位按位右移 -

~ 0011 1100 = 1100 0011

二进制数 1100 0011 对应十进制的 -61。

示例

在此示例中,我们重点介绍了所有位运算符的运算:

#include <stdio.h>

int main(){

   unsigned int a = 60;	/* 60 = 0011 1100 */  
   unsigned int b = 13;	/* 13 = 0000 1101 */
   int c = 0;           

   c = a & b;       /* 12 = 0000 1100 */ 
   printf("Line 1 - Value of c is %d
", c );

   c = a | b;       /* 61 = 0011 1101 */
   printf("Line 2 - Value of c is %d
", c );

   c = a ^ b;       /* 49 = 0011 0001 */
   printf("Line 3 - Value of c is %d
", c );

   c = ~a;          /*-61 = 1100 0011 */
   printf("Line 4 - Value of c is %d
", c );

   c = a << 2;     /* 240 = 1111 0000 */
   printf("Line 5 - Value of c is %d
", c );

   c = a >> 2;     /* 15 = 0000 1111 */
   printf("Line 6 - Value of c is %d
", c );
   
   return 0;
}

输出

运行此代码时,将产生以下输出 -

Line 1 - Value of c is 12
Line 2 - Value of c is 61
Line 3 - Value of c is 49
Line 4 - Value of c is -61
Line 5 - Value of c is 240
Line 6 - Value of c is 15

c_operators.html