从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;
}
答案 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
我们有答案