课上测试:位运算(AI)

news/2024/10/8 22:36:54/文章来源:https://www.cnblogs.com/guolingxi/p/18453188


2.使用位运算编写并调用下面函数,把当前时间(使用C库函数获得)设置到TIME中,给出代码,使用git记录过程。

为了使用位运算将当前时间设置到一个自定义的 TIME 结构体或变量中(尽管通常我们不会直接用位运算来处理时间,因为时间通常是由多个独立的字段如小时、分钟、秒等组成的),我们可以创建一个简单的结构体来存储时间,并编写一个函数来获取当前时间并使用位运算。
首先,我们需要定义一个结构体来存储时间,并创建一个全局变量 TIME。然后,我们将编写一个函数来获取当前时间,并使用位运算(尽管不必要)来设置 TIME。

·代码:

include <stdio.h>

include <time.h>

// 定义一个结构体来存储时间(尽管我们不会真正使用位运算来处理它)
typedef struct {
unsigned int hour : 5; // 假设小时数不超过31(实际上应该是0-23,但这里为了演示使用5位)
unsigned int minute : 6; // 假设分钟数不超过63(实际上应该是0-59,但这里为了演示使用6位)
unsigned int second : 6; // 同上,秒数不超过63
} TimeBits;

// 创建一个全局变量 TIME
TimeBits TIME;

// 获取当前时间并使用位运算设置 TIME(尽管这里并不真正需要位运算)
void setCurrentTimeUsingBitManipulation() {
time_t rawtime;
struct tm * timeinfo;

time(&rawtime);  
timeinfo = localtime(&rawtime);  // 这里我们并不真正使用位运算来设置 TIME 的字段,  
// 因为直接赋值更加清晰和直接。但为了符合您的要求,  
// 我们可以假装通过位运算来“设置”这些值(实际上只是赋值)。  
// 注意:这里的位运算只是形式上的,并不改变值的本质。  // 假装使用位运算(实际上只是赋值)  
TIME.hour = (timeinfo->tm_hour & 0x1F); // 0x1F 是 31 的十六进制,确保小时数在 0-31 范围内(尽管实际上应该是 0-23)  
TIME.minute = (timeinfo->tm_min & 0x3F); // 0x3F 是 63 的十六进制,确保分钟数在 0-63 范围内(尽管实际上应该是 0-59)  
TIME.second = (timeinfo->tm_sec & 0x3F); // 同上,秒数  // 注意:上面的位运算实际上是多余的,因为 tm_hour, tm_min, 和 tm_sec 已经在有效范围内。  
// 这里只是为了演示如何“使用”位运算。  

}

int main() {
setCurrentTimeUsingBitManipulation();

// 打印 TIME 的值  
printf("Current time (in bits): Hour = %u, Minute = %u, Second = %u\n", TIME.hour, TIME.minute, TIME.second);  return 0;  

}

·注意事项:
上面的代码中的位运算实际上是多余的,因为 tm_hour, tm_min, 和 tm_sec 已经是在它们的有效范围内(0-23, 0-59, 0-60 对于秒来说,尽管通常不会到60)。
使用位字段(bit-fields)来定义结构体中的成员可以限制它们占用的位数,但这通常用于硬件编程或内存优化,而不是处理时间。

·git操作概述:
1.初始化git仓库: git init
2.添加文件到git:git add time_setter.c
3.提交文件到git:git commit -m "Initial commit: Adding time setter function using bit manipulation (for demonstration purposes only)"

3.使用位运算编写并调用下面函数,读取TIME中的时间,给出代码,使用git记录过程。

首先,我们假设 TIME 是一个结构体,它包含了小时、分钟和秒这三个字段。由于希望使用位运算,我们可以将这些字段定义为位字段(bit-fields),但请注意,在实际应用中,直接使用整数类型来存储时间字段通常是更加简单和直观的方法。
接下来,我们将编写 setHour、setMinute 和 setSecond 函数的实现,这些函数将使用位运算来设置 TIME 结构体中的相应字段。
此外,我们还需要一个函数来读取 TIME 中的时间,并打印出来。最后,我们会编写一个 main 函数来测试这些功能,并使用 git 来记录代码编写的过程。

·代码:

include <stdio.h>

include <stdint.h>

// 假设 TIME 是一个结构体,包含小时、分钟和秒作为位字段
typedef struct {
uint8_t hour : 5; // 假设小时数不超过 31(5 位足够)
uint8_t minute : 6; // 假设分钟数不超过 63(6 位足够)
uint8_t second : 6; // 假设秒数不超过 63(6 位足够,虽然实际上秒数最大为 59)
} TimeBits;

// 创建一个全局变量 TIME
TimeBits TIME = {0, 0, 0};

// 使用“位运算”设置小时(实际上是直接赋值)
void setHour(int h) {
TIME.hour = (h & 0x1F); // 0x1F 是 31 的十六进制表示,确保小时数在 0-31 范围内
}

// 使用“位运算”设置分钟(实际上是直接赋值)
void setMinute(int m) {
TIME.minute = (m & 0x3F); // 0x3F 是 63 的十六进制表示,确保分钟数在 0-63 范围内
}

// 使用“位运算”设置秒(实际上是直接赋值)
void setSecond(int s) {
TIME.second = (s & 0x3F); // 同上,确保秒数在 0-63 范围内
}

// 读取并打印 TIME 中的时间
void printTime() {
printf("Current time: Hour = %u, Minute = %u, Second = %u\n", TIME.hour, TIME.minute, TIME.second);
}

int main() {
// 使用 git 记录代码编写过程(这一步在实际操作中是通过命令行完成的,不是代码的一部分)
// 例如:
// git init
// git add .
// git commit -m "Initial commit: Adding time setting and printing functions"

// 设置时间  
setHour(14);  
setMinute(30);  
setSecond(45);  // 打印时间  
printTime();  return 0;  

}

·注意:
1.在这个例子中,并没有真正使用复杂的位运算,因为时间字段已经是独立的,只需要简单地赋值。
2.由于位字段的跨平台兼容性可能会有所不同,因此在不同的编译器或平台上运行时,您可能需要检查生成的代码以确保它按预期工作。

4.完成main.c测试模块,测试你给出的代码,编译运行结果。
·保存代码:将上述代码保存为 main.c 文件。
·编译代码:在命令行或终端中,使用 gcc 编译代码。 gcc -o main main.c
·运行程序:编译成功后,运行生成的可执行文件。
输出:
当前系统时间: (当前的系统时间,例如) Wed Oct 4 14:35:02 2023
设置分钟为22后的时间: Wed Oct 4 14:22:02 2023
读取的分钟: 22
·获取系统时间设置TIME
使用 time(&rawtime) 获取当前系统时间,并将其存储在 rawtime 中。
使用 localtime(&rawtime) 将 rawtime 转换为本地时间,并返回一个指向 tm 结构体的指针 timeinfo。
·读取你设置的结果
使用 asctime(timeinfo) 将 tm 结构体格式化为字符串并打印。
·设置minute为你学号最后两位(22)
直接修改 timeinfo->tm_min 的值为 22。
·读取minute
再次使用 asctime(timeinfo) 打印修改后的时间。
读取 timeinfo->tm_min 并打印

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/810233.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 pinia 存数据

pinia是vue2中的vuex,状态管理,可以实现数据共享 1、先安装 npm install pinia2、在main.ts中进行创建和载入3、在src下新建store文件夹 定义存的文件 4、在组件中使用 此时控制台会有具体的值。

笑傲江湖单机版安装教程+虚拟机一键端+GM+10职业单人副本

今天给大家带来一款单机游戏的架设:笑傲江湖10职业单机版单人副本坐骑门徒新时装商完整任务。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你…

Eplan插件 - 自由文本编辑器

前言 使用此插件可以快速完成对项目中的自由文本、路径功能文本的修改、删除等操作。 插件介绍 用户界面 插件UI界面进行了更新,相比较之前的插件界面风格更清爽简洁。功能介绍插件批量将选中文本中的源文本替换为修改文本。 插件支持多种选择方式,可以在绘图区选中文本,也可…

Logisim-015-偶校验检错

仓库地址 https://gitee.com/gitliang/logisim-to-cpu

Android开发:日志功能备忘

临时记一下吧,以后就直接复制粘贴这里面的好了。实现一个日志记录程序的运行状态,并且带上时间信息,可以写一个类灵活调用。 MyLog.java package com.example.networkaccessrestrictions;import static android.content.ContentValues.TAG;import android.content.Context; …

学年(2024-2025-3) 学号(20241424)《计算机基础与程序设计》第三周学习总结

学期(2024-2025-3) 学号(20241424) 《计算机基础与程序设计》第三周学习总结 作业信息 |这个作业属于([2024-2025-3-计算机基础与程序设计](https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03)| |-- |-- | |这个作业要求在(2024-2025-3计算机基础与程序设计第三周作…

mysql join语法解析

MySQL 支持以下 JOIN 语法用于 SELECT 语句和多表 DELETE 和 UPDATE 语句中的 table_references 部分: table_references: 查询中涉及的一个或多个表的引用,可以是简单表名或 JOIN 表达式的组合。 escaped_table_reference [, escaped_table_reference] ...escaped_table_ref…

Tableau修改行和列的颜色

1.修改颜色 1.1 在列上右键点击设置格式1.2 修改列和角2.逆时针、由里及外依次设置格式在直条上右键

论文《Learning Properties of Ordered and Disordered Materials from Multi-fidelity Data》中的代码实现

github地址:https://github.com/materialsvirtuallab/megnet/tree/master/multifidelity#issues介绍:当前的存储库利用了由同一作者开发的现有MEGNET软件包,并将MEGNET功能扩展到多保真数据集的建模。该存储库将共享公开发布的多保真带隙数据,并展示了运行多保真数据集的模…

Tableau双轴

1.添加度量到行2.添加分类到列3.拖动度量到左侧利润字段处放开

Tableau文本表、直条、散点图、折线图、

1文本表 两次双击选中两个维度2.直条 两次双击依次分别选中一个度量和维度3.散点图 两次双击选中两个度量4.折线图 两次双击依次分别选中一个日期和一个度量