有必要编写一个通用方法,允许您从无符号整数 (Uint32) 中提取特定的位帧,并将所选帧以不同的组合转换回整数 (Int32)。
示例(要接收的帧为粗体): Number = 4194967295 = 1111 10100000101000011110 11111111
1111 10100000101000011110 11111111
更远
111 1 10100000101000011110 11111111 - 这里一切都很简单,为了提取一个特定的位,编写了一个单独的方法,内容如下:
value & (1 << (bitNumber));
然后
1111 101000001010000111 10 11111111
1111 10100000101000011110 11111111
- 该方法称为 GetBitFrame
- 返回一个整数 (int)
- 第一个参数是原始数字,一个无符号整数(uint)
- 第二个参数是帧大小(从整数中提取的位数)
- 好吧,参数,例如,用于左右移动的参数(简而言之,int 并不重要)。
我这样做了,但它不能正常工作:
private const uint Value = 4194967295;
private int GetBitFrame(short leftShift, short rightShift)
{
if (leftShift < 0 || leftShift > 31 || rightShift < 0 || rightShift > 31)
{
throw new ArgumentOutOfRangeException();
}
var buffer = (int)((Value << 1) >> leftShift); // откинул справа на leftShift
var result = buffer << rightShift; // откинул влево на rightShift
return result;
}
public int TwentyBitFrame => GetBitFrame(9, 4); // Тут должен получить 10100000101000011110 DEC = 657950
我们分两个阶段进行。
我们有参数
source(从我们提取位的位置),position(从什么地方),length(片段长度)。对于位置,最简单的事情是
source向右移动position一点以删除所有低(右)位。为了摆脱高位,您需要一个低位
length为 1 且高位32 - legnth为 0 的掩码。我们从所有的 ( ) 中取一个无符号值
uint.MaxValue并向右移动32 - legnth一点。移位无符号数时,空位将用零填充。全部的:
测试:
结论: