《C语言编程魔法书:基于C11标准》——2.7 按位逻辑运算

简介:

本节书摘来自华章计算机《C语言编程魔法书:基于C11标准》一书中的第2章,第2.7节,作者 陈轶,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.7 按位逻辑运算

按位逻辑运算在计算机编程中会经常涉及,这些运算都是针对二进制比特进行操作的。所谓的“按位”计算就是指对一组数据的每个比特逐位进行计算,并且对每个比特的计算结果不会影响其他位。常用的按位逻辑运算包括“按位与”、“按位或”、“按位异或”以及“按位取反”四种。下面将分别介绍这4种运算方式。

1)按位与:它是一个双目操作,需要两个操作数,在C语言中用&表示。两个比特的按位与结果如下:

0 & 0=0; 0 & 1=0; 1 & 0=0; 1 & 1=1

也就是说,两个比特中如果有一个比特是0,那么按位与的结果就是0,只有当两个比特都为1的时候,按位与的结果才为1。比如,对两个字节0100 1010和1111 0011进行按位与的结果为0100 0010。按位与一般可用于判定某个标志位是否被设置。比如,我们假定处理一个游戏手柄的按键事件,用一个字节来存放按键被按下的标志,前4个比特分别表示“上”、“下”、“左”、“右”。比特4表示按下了“A”键,比特5表示按下了“B”键,比特6表示按下了“X”键,比特7表示按下了“Y”键。那么当我们接收到二进制数01010100时,说明用户同时按下了“左”方向键、“A”键和“X”键。那么我们判定按键标志时可以通过按位与二进制数1来判定是否按下了“上”键,按位与二进制数10做按位与操作来判定是否按下了“下”键,跟二进制数100做与操作来判定是否按下了“左”键,以此类推。如果按位与的结果是0,说明当前此按键没有被按下,如果结果不为零,说明此按键被按下。

2)按位或:它是一个双目操作符,需要两个操作数,在C语言中用“|”表示。两个比特的按位或结果如下:

0 | 0=0; 0 | 1=1; 1 | 0=1; 1 | 1=1

也就是说,只要有一个比特的值是1,那么按位或的结果就是1,只有当两个比特的值都为0的时候,按位或的结果才是0。比如,对于两个字节0100 1010和1111 0011进行按位或的结果为1111 1011。按位或一般可用于设置标志位。就如同上述例子,如果用户按下了“上”键,那么系统底层会将最低位设置为1;如果用户按下了“Y”键,那么系统底层会将最高位设置为1。随后系统会将这串信息发送到应用UI层。

3)按位异或:它是一个双目操作,需要两个操作数,在C语言中用^表示。两个比特的按位异或结果如下

0 ^ 0=0; 0 ^ 1=1; 1 ^ 0=1; 1 ^ 1=0

也就是说,如果两个比特的值相同,那么按位异或的结果为0,不同为1。比如,对于两个字节0100 1010和1111 0011进行按位或的结果为1011 1001。按位异或适用于多种场景,比如我们用一个输入比特与1进行异或就可以反转该输入比特的值,输入为0,那么结果为1;输入为1,那么结果为0。任一比特与0异或,那么结果还是原比特的值。按位异或跟按位与和按位或不同,它可以对数据信息进行叠加组合。因为给定任一比特,对于另外一个比特的输入,不同的输入值对应不同的输出,所以我们通过异或能还原信息。比如,我们有两个整数a和b,我们设c=a ^ b。对于c,我们可以通过c ^ a重新得到b,也可以通过c ^ b来重新得到a。所以异或在信息编码、数据加密等技术上应用得非常多。

4)按位取反:它是一个单目操作,只需要一个操作数,在C语言中用~表示。一个比特的按位取反结果如下:~0=1;~1=0。比如,对一个字节0100 1010进行按位取反的结果为1011 0101。

相关文章
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
912 8
|
C语言
【C语言】逻辑操作符详解 - 《真假美猴王 ! 》
C语言中有三种主要的逻辑运算符:逻辑与(`&&`)、逻辑或(`||`)和逻辑非(`!`)。这些运算符用于执行布尔逻辑运算。
1858 7
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
C语言 开发者
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
1036 5
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
645 4
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
983 2
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
2681 12
|
编译器 C语言 C++
【C语言】精妙运用内存函数:深入底层逻辑的探索
【C语言】精妙运用内存函数:深入底层逻辑的探索
294 0
|
C语言
《啊哈C语言!逻辑的挑战(修订版)》| 每日读本书
“用编程轻松提升逻辑力!每个人都应该学习如何编程,因为它教会你如何思考。——史蒂夫.乔布斯” 。每日搜罗最具权威专业书籍,更多图书请关注“每日读本书”。
3763 0
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
1073 23