首页 > 解决方案 > 从C中的数字中提取值

问题描述

我有以下任务:

考虑到无符号整数上的 32 位表示这样的日期:
位 0 到 7 是日期
位 8 到 23 是年
位 24 到 31 是月份

实现函数 unsigned int Greater_date(unsigned int date1, unsigned int date2 )返回作为参数传递的两个日期中较大的一个。

如何使用移位来提取日、年和月?

我开发了这个:

n = 16;
year1 = date1 << n; // shift left
year2 = date2 << n; // shift left

n = 16;
year1 = year1 >> n; // shift right
year2 = year2 >> n; // shift right

n = 24;
month1 = date1 >> n; // shift right
month2 = date2 >> n; // shift right

n=8;
day1 = date1 << n;  // shift left
day2 = date2 << n;  // shift left

n = 24;
day1 = day1 >> n;   // shift right
day2 = day2 >> n;   // shift right

但这在我的程序必须运行的一些测试中失败了,即使我用一个快速的 main 进行了测试并且它显示了正确的日期。

标签: cdatebit-shift

解决方案


您不需要提取所有内容。这会做。假设这dym是指定格式的输入日期。

uint32_t ymd = 0;
ymd |= (dym<<8)  & 0xFF000000;
ymd |= (dym<<16) & 0x00FFFF00;
ymd |= (dym>>16) & 0x000000FF;

然后ymd将是相同的日期,但格式为年-月-日。现在您可以使用>.

这是一个函数:

uint32_t dym2ymd(uint32_t, dym)
{
    uint32_t ymd = 0;
    ymd |= (dym<<8)  & 0xFF000000;
    ymd |= (dym<<16) & 0x00FFFF00;
    ymd |= (dym>>16) & 0x000000FF;
    return ymd;
}

uint32_t greater_date(uint32_t date1, uint32_t date2)
{
    return dym2ymd(date1)>dym2ymd(date2) ? date1 : date2;
}

我更改了参数和返回类型的类型。如果类型需要能够保持 32 位,则不应使用int. 您可以long改用它,但在这种情况下,它似乎更适合具有精确宽度的类型。


推荐阅读