Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 位掩蔽和移位功能的改进_C#_Bitwise Operators_Masking - Fatal编程技术网

C# 位掩蔽和移位功能的改进

C# 位掩蔽和移位功能的改进,c#,bitwise-operators,masking,C#,Bitwise Operators,Masking,能否改进此功能以提高其效率 private unsafe uint GetValue(uint value, int bitsToGrab, int bitsToMoveOver) { byte[] bytes = BitConverter.GetBytes(value); uint myBitMask = 0x80; //MSB of 8 bits (byte) int arrayIndex = 0;

能否改进此功能以提高其效率

private unsafe uint GetValue(uint value, int bitsToGrab, int bitsToMoveOver)
        {
            byte[] bytes = BitConverter.GetBytes(value);

            uint myBitMask = 0x80;  //MSB of 8 bits (byte)
            int arrayIndex = 0;
            for (int i = 0; i < bitsToMoveOver; i++)
            {
                if (myBitMask == 0)
                {
                    arrayIndex++;
                    myBitMask = 0x80;
                }

                myBitMask >>= 1;
            }

            uint outputMask1 = (uint)(1 << (bitsToGrab - 1));
            uint returnVal = 0;
            for (int i = 0; i < bitsToGrab; i++)
            {
                if (myBitMask == 0)
                {
                    arrayIndex++;
                    myBitMask = 0x80;
                }

                if ((bytes[arrayIndex] & myBitMask) > 0)
                {
                    returnVal |= outputMask1;
                }

                outputMask1 >>= 1;
                myBitMask >>= 1;
            }

            return returnVal;
        }
private-unsafe uint-GetValue(uint-value、int-bitsToGrab、int-bitsToMoveOver)
{
字节[]字节=位转换器.GetBytes(值);
uint myBitMask=0x80;//8位的MSB(字节)
int-arrayIndex=0;
for(int i=0;i>=1;
}
uint outputMask1=(uint)(10)
{
returnVal |=outputMask1;
}
outputMask1>>=1;
myBitMask>>=1;
}
返回值;
}
我有一系列的单元。每个uint包含多个数据段。为了获得信息,我传入了位数和这些位数的偏移量。利用这些信息,我构建了一个输出值。 偏移量通常在字节边界上,但我不能保证它会在字节边界上

我真的很想看看我是否可以简化代码。我在代码中是否有不必要的冗长,或者是否可以做得更简洁一些

更新功能:你们对此有何感想

private unsafe uint GetValue(uint value, int bitsToGrab, int bitsToMoveOver)
        {
            if (bitsToGrab + bitsToMoveOver >= 32)
            {
                return 0;
            }

            byte[] bytes = BitConverter.GetBytes(value);
            Array.Reverse(bytes);
            uint newValue = BitConverter.ToUInt32(bytes, 0);

            uint grabMask = (0xFFFFFFFF << (32 - bitsToGrab));
            grabMask >>= bitsToMoveOver;

            uint returnVal = (newValue & grabMask) >> (32 - bitsToMoveOver - bitsToGrab);
            return returnVal;
}
private-unsafe uint-GetValue(uint-value、int-bitsToGrab、int-bitsToMoveOver)
{
如果(bitsToGrab+bitsToMoveOver>=32)
{
返回0;
}
字节[]字节=位转换器.GetBytes(值);
Array.Reverse(字节);
uint newValue=BitConverter.ToUInt32(字节,0);
uint grabMask=(0xFFFFFFFF>=比特移动;
uint returnVal=(newValue和grabMask)>>(32位stomoveover-bitsToGrab);
返回值;
}
这需要测试(并假设bitsToGrab+bitsToMoveOver bitsToMoveOver;
由于OP已指示它应该从数字的内部二进制表示(包括endian编码)中采样位,每个字内的字节顺序交换,因此您可以先像这样交换字节:

uint reorderedValue = ((value << 8) & 0xFF00FF00) | ((value >> 8) & 0x00FF00FF);
uint grabMask = ~(0xFFFFFFFF << (bitsToGrab + bitsToMoveOver));
return (reorderedValue & grabMask) >> bitsToMoveOver;
uint-reorderedValue=((值>8)和0x00FF00FF);
uint grabMask=~(0xFFFFFFFF>bitsToMoveOver;

您能否简单描述一下您想要实现的目标,因为位移位/掩蔽并不是很直观。需要检查阈值定义。鉴于输入值为2921803,需要抓取16位,需要移动0位,我预计输出值为:19349。我相信关键是,尽管数据作为uint传入,但它需要被视为字节[],并因此转换为它,它将移动字节。Ramhound-一个字节的定义是一个无符号8位整数。我没有将bitsToGrab/bitsToMoveOver作为无符号发送的事实与所述的问题无关。@Dan Bryant-你的正确答案按错误的字节顺序排列。我现在正在进行修复。@Jonathan,新同事de确实从2921803生成了19349。我相信这是一个混合的endian表示(当然有点奇怪)。这是一个经过字节顺序调整的版本-。它可能是错误的,所以有人应该检查它。(我不想窃取Dan的答案,因为他是正确的)。
uint reorderedValue = ((value << 8) & 0xFF00FF00) | ((value >> 8) & 0x00FF00FF);
uint grabMask = ~(0xFFFFFFFF << (bitsToGrab + bitsToMoveOver));
return (reorderedValue & grabMask) >> bitsToMoveOver;