gpt4 book ai didi

c# - 使用复杂的位掩码确定日期的哪个位被设置

转载 作者:太空狗 更新时间:2023-10-29 20:34:57 25 4
gpt4 key购买 nike

我有一个代表一周中的几天的移位掩码:

Sunday = 1
Monday = 2
Tuesday = 4
...
Saturday = 64

我正在使用位掩码,因为几天(至少一天)可能会设置为 1。

问题

然后我得到一个约会对象。任何日期。根据 date.DayOfWeek,我需要返回位掩码中设置的第一个最接近的日期。所以我的方法可以返回同一天或 datedate + 6 之间的任何其他日期。

示例 1

我的位掩码定义所有日期都设置为 1。在这种情况下,我的方法应该返回相同的日期,因为 date.DayOfWeek 是在位掩码中设置的。

例子2

我的位掩码定义只有星期三设置为 1。如果我的传入日期是星期二,我应该返回 date+1(即星期三)。但如果传入日期是星期四,我应该返回 date+6(又是星期三)。

问题

解决这个问题最快最优雅的方法是什么?为什么也是最快的?因为我需要多次运行它,所以如果我可以使用某种缓存结构来更快地获取日期,那将是首选。

您能否提供一些指导以优雅地解决此问题?我不想以充满 ifs 和 switch-case 语句的长意大利面条式代码结束...

Important: It's important to note that bitmask may be changed or replaced by something else if it aids better performance and simplicity of code. So bitmask is not set in stone...

一种可能的方法

每天生成一个偏移量数组并将其保存在私有(private)类变量中会很聪明。生成一次并在之后重用它,例如:

return date.AddDays(cachedDayOffsets[date.DayOfWeek]);

这样我们根本不使用位掩码,唯一的问题是如何用尽可能短的代码最快地生成数组。

最佳答案

我会用一个位掩码、一些移位和一个位扫描来解决这个问题。这不是一个非常明显的例程,但它应该很快,因为它从不分支:

original_date = Whatever                    //user input
bitmask = Whatever //user input
bitmask |= (bitmask << 7) //copy some bits so they don't get
//lost in the bitshift
bitmask >>= original_date.dayOfWeek() //assuming Sunday.dayOfWeek() == 0
return original_date + bitscan(bitmask) - 1 //the position of the least
//significant bit will be one greater
//than the number of days to add

Bitscan——尤其是你的,因为它只关心七位——很容易在查找表中实现。事实上,如果你做了一个自定义表,你可以调用 LSB 位 0,并跳过 return 语句中的减法。我猜所有这一切中最慢的部分是 dayOfWeek() 函数,但这取决于它的实现。

希望这对您有所帮助!

编辑:位扫描表示例(将 lsb 视为索引 1 - 您可能希望将其视为零,但这是一个更好的示例):

int[128] lsb = {
0, //0 = 0b00000000 - Special case!
1, //1 = 0b00000001
2, //2 = 0b00000010
1, //3 = 0b00000011
3, //4 = 0b00000100
1, //5 = 0b00000101
2, //6 = 0b00000110
....
1 //127 = 0b01111111
};

然后,要在 mask 上使用您的表格,您只需使用:

first_bit_index = lsb[mask & 127];

& 让您可以编写一个较小的表格,因为您真的只关心最低的七位。

PS:至少有一些处理器实现了一个位扫描指令,您可以使用它来代替,但您似乎不太可能用 C# 获得它们,除非某处有包装函数。

关于c# - 使用复杂的位掩码确定日期的哪个位被设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7603039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com