从 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
,但在这种情况下,使用具有精确宽度的类型似乎更合适。
我有以下作业:
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
,但在这种情况下,使用具有精确宽度的类型似乎更合适。