C 中的位运算
本文讨论 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 词法分析器定义; 即使它们通过了词法分析器,语法分析器也会拒绝它们。
这就是为什么诸如 >>>>
或 ||=
或 &&=
之类的缩写不起作用的原因。 也许会有一种编程语言可以接受它们作为有效的运算符。
相关文章
在 C 语言中使用 typedef enum
发布时间:2023/05/07 浏览次数:181 分类:C语言
-
本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
C 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:114 分类:C语言
-
本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量
C 语言中的 #ifndef
发布时间:2023/05/07 浏览次数:186 分类:C语言
-
本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。