位运算

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

posted @ 2024-10-08 11:34  童诗嘉20221409  阅读(9)  评论(0编辑  收藏  举报