将位移数字转换回原始索引

时间:2013-12-04 14:45:02

标签: c# bit-manipulation

我有一个标有[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;

2 个答案:

答案 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);
    }

为了澄清我实际上搜索了但我忘记了我想要做的事情的名字。