如何反转C中的位操作
how to reverse the Bit operation in C
我有以下 C 程序,它将获取 MSB、第二个 MSB、第三个 MSB 和 LSB,现在的值为 1588800373)。我该如何扭转它?
也就是说,如果程序有time_0 = 94,time_1 = 179,time_2 = 43,time_3 = 117,我如何构造回 now = 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_0
转换为 int
然后移动。这有可能转移到 int
的符号位,并且是 未定义的行为 。在具有 16-int 的小型平台上,移动 16 或更多是否也是 UB。使用足够宽的无符号类型。
原始代码受制于 y2038 bug 应该 time_t
编码为 32 位签名 int
。最好先把 time_t
变成 uint32_t
然后 split/shift 变成 4 个字节。
我有以下 C 程序,它将获取 MSB、第二个 MSB、第三个 MSB 和 LSB,现在的值为 1588800373)。我该如何扭转它? 也就是说,如果程序有time_0 = 94,time_1 = 179,time_2 = 43,time_3 = 117,我如何构造回 now = 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_0
转换为 int
然后移动。这有可能转移到 int
的符号位,并且是 未定义的行为 。在具有 16-int 的小型平台上,移动 16 或更多是否也是 UB。使用足够宽的无符号类型。
原始代码受制于 y2038 bug 应该 time_t
编码为 32 位签名 int
。最好先把 time_t
变成 uint32_t
然后 split/shift 变成 4 个字节。