位运算
20221409童诗嘉git仓库:https://gitee.com/tong-shijia20221409/network-programming/blob/master/exam2.c
1. 16 位TIME 的含义
TIME
(bit15) +++++ ++++++ +++++(bit0)
||||| |||||| |||||
||||| |||||| +------- second/2
||||| +-------------- minute
+-------------------- hour
含义:小时 (Hour): 占据最低的5位(bit 4 到 bit 0)。通常表示为0到23,表示一天中的小时数。
分钟 (Minute): 占据接下来的5位(bit 9 到 bit 5)。通常表示为0到59,表示小时中的分钟数。
秒/2 (Second/2): 占据最高的6位(bit 15 到 bit 10)。这里的“秒/2”意味着实际的秒数是这些位表示的值的两倍。
2. 使⽤位运算编写并调⽤下⾯函数 ,把当前时间(使⽤ C库函数获得)设置到 TIME 中,给出代码,使⽤ git记录过程。
git网址:https://gitee.com/tong-shijia20221409/network-programming/tree/master
代码呈现:
#include <stdio.h>
#include <time.h>
// 定义TIME变量,初始值为0
unsigned int TIME = 0x0000;
// 设置小时
void setHour(int h) {
TIME = (TIME & 0x003F) | (h << 11); // 将小时左移11位
}
// 设置分钟
void setMinute(int m) {
TIME = (TIME & 0xFC0F) | (m << 5); // 将分钟左移5位
}
// 设置秒
void setSecond(int s) {
TIME = (TIME & 0xFFE0) | s; // 秒不需要移位
}
// 获取当前时间并设置到TIME中
void setCurrentTimeToTIME() {
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
int hour = timeinfo->tm_hour;
int minute = timeinfo->tm_min;
int second = timeinfo->tm_sec;
// 确保小时在0-23之间
if (hour > 23) hour = 23;
// 确保分钟在0-59之间
if (minute > 59) minute = 59;
// 确保秒在0-59之间
if (second > 59) second = 59;
setHour(hour);
setMinute(minute);
setSecond(second);
}
int main() {
setCurrentTimeToTIME();
// 提取小时、分钟和秒
int hour = (TIME >> 11) & 0x1F;
int minute = (TIME >> 5) & 0x3F;
int second = TIME & 0x1F;
printf("TIME: %02d:%02d:%02d\n", hour, minute, second);
return 0;
}
运行结果:TIME: 11:33:26
3. 使⽤位运算编写并调⽤下⾯函数 ,读取TIME 中的时间,给出代码,使⽤ git 记录过程。
void setHour(int h)
void setMinute(int m)
void setSecond(int s)
代码呈现:
#include <stdio.h>
// 定义TIME变量,初始值为0
unsigned int TIME = 0x0000;
// 设置小时
void setHour(int h) {
TIME = (TIME & 0x3FFF) | (h << 10); // 确保小时在0-23之间,使用5位
}
// 设置分钟
void setMinute(int m) {
TIME = (TIME & 0xC0FF) | (m << 5); // 确保分钟在0-59之间,使用6位
}
// 设置秒
void setSecond(int s) {
TIME = (TIME & 0xFFE0) | (s & 0x3F); // 确保秒在0-59之间,使用6位
}
int main() {
// 直接设置TIME为14:09:09
int hour = 14;
int minute = 9;
int second = 9;
setHour(hour);
setMinute(minute);
setSecond(second);
// 读取并打印TIME变量
int readHour = (TIME >> 10) & 0x1F; // 使用5位存储小时
int readMinute = (TIME >> 5) & 0x3F; // 使用6位存储分钟
int readSecond = TIME & 0x3F; // 使用6位存储秒
printf("TIME: %02d:%02d:%02d\n", readHour, readMinute, readSecond);
return 0;
}
运行结果:TIME: 00:09:41
我的学号是20221409