gpt4 book ai didi

c - 如何反转C中的位操作

转载 作者:行者123 更新时间:2023-12-04 10:04:45 28 4
gpt4 key购买 nike

我有以下 C 程序,它将获得 MSB、2nd MSB、3rd MSB 和 LSB,其值现在为 1588800373)。我该如何逆转?
也就是说,如果程序有time_0 = 94,time_1 = 179,time_2 = 43,time_3 = 117,我如何构造它回到现在=1588800373;

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>

int main()
{
time_t now = 1588800373; //time(NULL);
uint8_t time_0 = now >> 24;
uint8_t time_1 = (now >> 16) & 0xFF;
uint8_t time_2 = (now >> 8) & 0xFF;
uint8_t time_3 = now & 0xFF;

printf("%lu, %u, %u, %u, %u\n", now, time_0, time_1, time_2, time_3);
// 1588800373, 94, 179, 43, 117

return 0;
}

最佳答案

用至少 32 位无符号数学移位字节然后 | .

uint32_t repacked = ((uint32_t)time_0 << 24) | ((uint32_t)time_1 << 16) | 
((uint32_t)time_2 << 8) | time_3;
time_t now_again = (time_t) repacked;
time_0 << 24本身转换 time_0int然后转移。这有可能转换为 int 的符号位并且是未定义的行为。在 16-int 的小平台上,移动 16 或更多也是 UB。使用足够宽的无符号类型。

原码以 y2038 bug为准应该 time_t编码为 32 位有符号 int .最好先拿 time_tuint32_t然后拆分/移位为 4 个字节。

关于c - 如何反转C中的位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61645939/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com