c - 从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 进行了测试并且它显示了正确的日期。
解决方案
您不需要提取所有内容。这会做。假设这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
改用它,但在这种情况下,它似乎更适合具有精确宽度的类型。
推荐阅读
- python - 如何从 Python 的根目录导入模块?
- reactjs - 删除在 ES6 语法中在另一个数组中重复的所有元素
- angularjs - 如何在表初始化后更新 ag-Grid 的 autoGroupColumnDef 属性
- javascript - 试图理解 Javascript 脚本的执行顺序。尝试过异步、延迟、动态加载脚本,结果都出乎意料
- pandas - GeoViews 保存的内联 HTML 文件非常大
- c# - 警报框 MVC c#
- powershell - 如何更改 Visual Studio 代码“Powershell 集成控制台”?
- typescript - 使实现的接口中的可选道具不是可选的
- sql - 云存储的ms access数据库的pypyodbc sql查询在查询最新数据时速度很慢,但在查询最旧数据时速度很快
- azure - Azure 流分析:参考数据中的正则表达式