从UInt64 Number的startPos开始,获取n位的效率如何

时间:2014-02-27 14:15:43

标签: c# .net types

从UInt64编号的startPos开始,获得n位的效率如何。

我知道我会一点一点地得到,但我想以更有效的方式做。

    public static ulong GetBits(ulong value, int startPos)
    {
        int mask = 1 << startPos;
        ulong masked_n = value & (ulong)mask;
        ulong thebit = masked_n >> startPos;
        return (ulong)thebit;
    }

2 个答案:

答案 0 :(得分:2)

// assuming bit numbers start with 0, and that
// startPos is the position of the desired
// least-significant (lowest numbered) bit

public static ulong GetBits( ulong value, int startPos, int bits )
{
    ulong mask = ( ( 1UL << bits ) - 1 ) << startPos;
    return ( value & mask ) >> startPos;
}

答案 1 :(得分:1)

好的 - 让我们说(为了理智,让我们说8位)你有:

10101010

你想要从第2位( n )开始的3( m )位。你需要这样的面具:

source:  10101010
mask:    00011100
&result: 00001000

那么如何生成面具?我们从1开始并按我们想要的位数( m

进行移位
start:        00000001
start << 3:   00001000

现在我们需要在面具中使用三个1,所以我们在最后一步中减去一个:

00001000 - 1 = 00000111

所以我们几乎有了我们的面具,现在我们只需要通过将它移动2来排列它( n

00000111 << 2 = 00011100

我们有答案