- 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 - 主函数
- 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 - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void指针
- C - 悬空指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或枚举)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入和输出
- C - 文件I/O(文件处理)
- C预处理器
- C - 预处理器
- 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语言中的位与运算符 (&)
位与 (&) 运算符根据以下真值表执行操作:
位 a | 位 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。
位或 (|) 运算符
位或 (|) 运算符根据以下真值表执行操作:
位 a | 位 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。
位异或 (^) 运算符
位异或 (^) 运算符根据以下真值表执行操作:
位 a | 位 b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
位二进制异或对数字在其二进制形式中每个位置的位执行逻辑运算。异或运算称为“互斥或”。
注意:仅当一个操作数为1时,异或的结果才为1。与或不同,如果两个位都为1,则异或的结果为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。
一补码 (~) 运算符
C语言中的一补码运算符 (~) 是一元运算符,只需要一个操作数。它具有“翻转”位的作用,这意味着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\n", c ); c = a | b; /* 61 = 0011 1101 */ printf("Line 2 - Value of c is %d\n", c ); c = a ^ b; /* 49 = 0011 0001 */ printf("Line 3 - Value of c is %d\n", c ); c = ~a; /*-61 = 1100 0011 */ printf("Line 4 - Value of c is %d\n", c ); c = a << 2; /* 240 = 1111 0000 */ printf("Line 5 - Value of c is %d\n", c ); c = a >> 2; /* 15 = 0000 1111 */ printf("Line 6 - Value of c is %d\n", 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