从 C 中的数字中提取值

Extracting values frm a number in C

我有以下作业:

Considering that the 32 bits on an unsigned integer represent a date like this:
Bits 0 to 7 are the day
Bits 8 to 23 are the year
Bits 24 to 31 are the month

Implement the function unsigned int greater_date(unsigned int date1, unsigned int date2) that returns the greater of the two dates passed as parameters.

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

我开发了这个:

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

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

以下功能对你有用吗?

unsigned int myd_to_ymd(unsigned int date) {
    unsigned int year = (date >> 8) & 0x000000FF;
    unsigned int month = (date >> 24) & 0x0000000F;
    unsigned int day = date & 0x0000000F;
    return year * 0x000000FF + month * 0x0000000F + day;
}

unsigned int greater_date(unsigned int date1, unsigned int date2) {
    if (myd_to_ymd(date1) >= myd_to_ymd(date2))
    {
        return date1;
    }
    else return date2;
}

您不需要提取所有内容。这样就可以了。假设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;
}

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