如何反转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 个字节。