活动介绍
file-type

C语言位运算详解:异或、取反、左移与右移的应用

PPT文件

下载需积分: 18 | 5.82MB | 更新于2024-08-20 | 119 浏览量 | 1 下载量 举报 收藏
download 立即下载
本资源是关于C语言中位运算的详细教程,主要介绍了按位异或(^)、按位取反(~)、按位左移(<<)和按位右移(>>)四种操作符。按位异或用于实现位级的逻辑运算,通过改变某个或某些位的状态,而其他位保持不变。例如,通过`a=a^b, b=b^a, a=a^b`这组操作,可以实现两个变量值的交换,利用了异或运算的特性。 按位取反则用于对整个数值进行位级翻转,所有位从1变为0,或者从0变为1,这对于在不同平台下保持代码的兼容性具有重要意义,如在IBM-PC机中,取反操作会根据数值的具体情况返回特定的结果。 左移(<<)操作符可以将一个数的位向左移动指定的位数,低位补零,这种操作相当于乘以2的对应次幂,对提升程序执行效率有很大帮助。右移(>>)操作符则将数向右移动,无符号数和正数高位补零,而对于有符号数,负数可能会发生算术右移或逻辑右移,具体取决于系统的实现方式。 此外,本资源还提到了一些预备知识,如冯•诺依曼原理,它是现代计算机架构的基础,强调了存储程序的概念和计算机的五大组成部分。数制方面,讲解了二进制、八进制和十六进制的定义以及它们之间的转换方法。 在学习C语言时,建议学生熟悉这些位运算符的用法,理解它们在实际编程中的应用场景,并且要注重课前预习,保持课堂参与度,认真完成作业,特别是上机实践部分,以加深对理论知识的理解和掌握。通过这样的学习,可以更好地编写高效、兼容性好的C程序。

相关推荐

filetype

用C语言编写代码。问题描述 该系统要求建立一个南邮图书馆管理系统,并具有排序、查找、计算、显示等功能。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些算法思想的应用。 图书的信息应包括:索引号,名称,馆藏地址(三牌楼、仙林)、类别(人文、科技、外语等),数量,价格,归还日期,借阅次数,借阅状态(可借、不可借)。 2 功能要求 代码要能提供以下几个基本功能。 (1)管理员(1名)通过用户名密码登录系统,修改密码前需输入旧密码 (1.1)对已图书信息进行更新操作,包括添加和删除一种书的信息、修改图书信息(例如图书被借阅,书的数目减1,借阅次数加1,如果数量为0则状态为不可借); (1.2)通过按图书的名称、索引号、借阅次数、价格区间、借阅状态、馆藏地址精准查询图书信息; (1.3)显示所有即将到期的图书的信息(归还日期在三天之内),对用户发出还书提醒; (1.4)按借阅次数、图书名称首字母、索引号、入库时间对所有图书进行排序; (1.5)管理员可添加、删除、修改用户各项数据 (2)用户(多个)通过用户名密码登录系统,修改密码前需输入旧密码 (2.1)通过按图书的名称、类别、索引号、借阅状态、馆藏地址精准查询图书信息; (2.2)查到想借的图书后进行借阅操作 (2.3)在借图书按照剩余归还时间、图书名称首字母进行排序 (2.4)每人最多借阅5本 (2.5)若忘记密码,则对管理员发出申请 (3)将所有相关信息内容存为文件。 【选做要求】 (1)最大借阅数可改为本科生最多借阅5本、研究生最多借阅10本 【其他要求】 (1)界面友好美观,交互方便; (2)对用户的输入进行一定的正确性检查,使得输入信息符合逻辑与实际。

filetype

// CRC-8 多项式:0x07,初始值:0x00 uint8_t crc8(uint8_t *data, uint8_t length) { uint8_t crc =0; if (data == 0 || length == 0) { return 0; } for (uint8_t byte_index = 0; byte_index < length; byte_index++) { crc ^= data[byte_index]; for (uint8_t bit_index = 0; bit_index < 8; bit_index++) { if (crc & 0x80) { crc = (unsigned char)((crc << 1) ^ 0x07); } else { crc <<= 1; } } } return crc; } // 曼彻斯特编码发送一个字节(MSB优先) void send_byte(uint8_t byte) { for (uint8_t bit_index = 0; bit_index < 8; bit_index++) { current_bit = (uint8_t)(byte & 0x80) ? 1 : 0; // 提取当前最高位 // 发送当前比特的前半周期电平 ASK_DATA = (current_bit == 1) ? 0 : 1; // 1:前低后高;0:前高后低 delay_50us(1); // 前半周期延时(例如50μs) // 发送当前比特的后半周期电平 ASK_DATA = current_bit; // 1:后半高;0:后半低 delay_50us(1); // 后半周期延时(例如50μs) byte <<= 1; // 左移准备处理下一个比特 } } // 发送一个带 CRC 校验的字节数据 void transmit_byte(uint8_t data) { uint8_t crc; uint8_t send_data[2]; // 分别给数组元素赋值(必须先定义再赋值,不然会报错,中微编译器真难用) send_data[0] = data; send_data[1] = 0; // 计算 CRC 校验值 crc = crc8(send_data, 1); send_data[1] = crc; // 发送起始位(高电平) ASK_DATA = 1; delay_50us(10); // 发送数据和 CRC 校验值 for (uint8_t byte_index = 0; byte_index < 2; byte_index++) { send_byte(send_data[byte_index]); } // 发送停止位(低电平) ASK_DATA = 0; delay_50us(10); }