迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 中的位运算

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文讨论 C 中的按位运算(和运算符)。这些概念也扩展到 C++。

除了这些运算符之外,本文还讨论了一种常被误解的运算符赋值速记符号(例如 += 运算符赋值)。 我们将在按位运算符的上下文中讨论这个问题。

本文将提供这些运算符中的每一个的示例,同时显示符号和它们各自的输出。 我们还将讨论 C 不支持的速记符号。

最后,我们将简要讨论词法分析,这是编译器生成标记的程序编译阶段。 这些是代码中最小的部分,例如关键字、标识符、常量、字符串文字等。

Bitwise & and &= Operators

& 是按位与运算符。 它是这样使用的:

int test = 0x6A;
test = test & 0x50;

上面的代码运行 0x6A 和 0x50 之间的按位和比较并将结果保存到测试变量。 按位与运算比较两个参数的每一位。

如果两个操作数的位都为 1,则结果为每一位 1,否则结果为 0。

0x6A的二进制为1101010,0x50的二进制为1010000,故与运算结果为1000000。

现在我们可以讨论速记符号。 上面这段代码可以方便的写成如下:

int test2 = 0x6A;
test2 &= 0x50;

通常,x &= 5 等价于 x = x & 5 。但是,这也可以扩展到其他操作; 最常见的是 += 、**-=** 、*= 、**/=** 。

这种速记符号的更不常见的例子是按位运算,例如 >>= 、**<<=** 、**|=** 、**&=** 、^=


按位 | 和 |= 运算符

| 是按位包含或运算符。

int test = 0x6A;
test = test | 0x50;

简写为:

int test = 0x6A;
test |= 0x50;

test 的结果值为 1111010。

按位包含或运算比较两个参数的每一位。 如果操作数的任一位为 1,则结果为每一位 1,只有当两个操作数都为 0 时,结果才为 0。


按位 ^ 和 ^= 运算符

^ 是按位异或运算符。

int test = 0x6A;
test = test ^ 0x50;

简写为:

int test = 0x6A;
test ^= 0x50;

test 结果值为:0111010

按位异或运算比较两个参数的每一位。 如果两位具有不同的值,则结果的每一位的结果位值为 1; 如果两个位具有相同的值,则为 0。


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

移位运算符有两个操作数。

移位应用于左侧的操作数。 并且应用移位的位数由右操作数确定。

有两种移位:左移位 << ,和右移位 >> 。 一般使用如下:

如果您不确定其详细信息,请参阅此链接文档以获取有关轮班操作员结果的更多详细信息。

int test5 = 0xFF;
test5 = test5 << 2;

在此示例中,存储在 test5 中的位将左移(如运算符的方向所示)2 位。

Before shift: 0011111111
After shift:  1111111100

同样,对于右移:

int test5 = 0xFF;
test5 = test5 >> 2;

在此示例中,存储在 test5 中的位将右移 2 位。

Before shift: 11111111
After shift:  00111111

右移和左移的简写符号与我们上面的类似。

速记右移符号:

int test5 = 0xFF;
test5 >>= 2;

速记左移符号:

int test5 = 0xFF;
test5 <<= 2;

算术速记(复合赋值语句)

本节将简要讨论算术运算的简写形式。 变量声明后的以下两个语句是等价的:

对于加法:

int addTest = 5;

addTest += 5;

addTest = addTest + 5;

对于乘法:

int multTest = 5;

multTest *= 5;

multTest = multTest * 5;

对于除法:

int divTest = 5;

divTest /= 5;

divTest = divTest / 5;

对于减法:

int subTest = 5;

subTest -= 5;

subTest = subTest - 5;

对于模除:

int remTest = 5;

remTest %= 5;

remTest = remTest % 5;

词法分析和你不能做什么

词法分析是将每个操作数和运算符分离成标记的阶段。 例如,在语句 x + 2 中,其中 x 是一个变量,分析器将把 x 和 2 作为操作数,将 + 作为运算符。

对于简写符号,运算符(例如 |=)与令牌代码一起存储,这足以识别它们。 如果任何简写不起作用,那么它们(简单地)还没有为 C 词法分析器定义; 即使它们通过了词法分析器,语法分析器也会拒绝它们。

这就是为什么诸如 >>>>||=&&= 之类的缩写不起作用的原因。 也许会有一种编程语言可以接受它们作为有效的运算符。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便