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