我有一个标有[Flags]
的枚举,看起来有点像这样:
None = 1 >> 1, // 0
Monday = 1, // 1
Tuesday = 1 << 1, // 2
Wednesday = 1 << 2, // 4
Thursday = 1 << 3, // 8
Friday = 1 << 4, // 16
Saturday = 1 << 5, // 32
Sunday = 1 << 6, // 64
FirstWeek = 1 << 7, // 128
SecondWeek = 1 << 8, // 256
ThirdWeek = 1 << 9, // 512
FourthWeek = 1 << 10 // 1024
如果我们假设我们转移的数字是N,我需要能够做到这一点(伪前进):
function convert(MyEnum flags) {
return flags >> n;
}
不知道MyEnum的价值是什么。这可能吗?
我需要第N个索引的原因很简单,因为我需要能够在两个枚举之间进行转换 - 这一个,一个不是[Flags]
标记的,但索引为1-7(每天)。
我该怎么做?
澄清:
我需要能够从flags = ThirdWeek (equal to 1 << 9)
转到10(N (which is 9) + 1
)
我通过以下方式解决了这个问题:
int base = (int)Math.Log((double)flags;
答案 0 :(得分:3)
如果您确定该数字是2的幂,您可以通过计算尾随零来解决此问题,如下所示:
uint v;
uint c = 32;
v &= (0-v);
if (v != 0) c--;
if ((v & 0x0000FFFF) != 0) c -= 16;
if ((v & 0x00FF00FF) != 0) c -= 8;
if ((v & 0x0F0F0F0F) != 0) c -= 4;
if ((v & 0x33333333) != 0) c -= 2;
if ((v & 0x55555555) != 0) c -= 1;
此代码为taken from here。
答案 1 :(得分:1)
对数。我希望我在数学方面给予更多关注。
None = 1 >> 1, // 0
Monday = 1, // 1
Tuesday = 1 << 1, // 2
Wednesday = 1 << 2, // 4
Thursday = 1 << 3, // 8
Friday = 1 << 4, // 16
Saturday = 1 << 5, // 32
Sunday = 1 << 6, // 64
FirstWeek = 1 << 7, // 128
SecondWeek = 1 << 8, // 256
ThirdWeek = 1 << 9, // 512
FourthWeek = 1 << 10 // 1024
function convert(MyEnum flags) {
return Math.Log((int)flags, 2);
}
为了澄清我实际上搜索了但我忘记了我想要做的事情的名字。