Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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#_.net_Clr_Byte_Bit - Fatal编程技术网

C# 将有符号整数转换为两个无符号短整数,以便进行重建

C# 将有符号整数转换为两个无符号短整数,以便进行重建,c#,.net,clr,byte,bit,C#,.net,Clr,Byte,Bit,目前,我正在使用BitConverter将两个无符号短裤打包到一个有符号整数中。这段代码针对不同的值执行数百万次,我认为代码可以进一步优化。下面是我目前正在做的事情——您可以假设代码是C#/NET 因此,我想到,如果我使用位移位,就可以避免构造数组的开销。但就我个人而言,我不知道什么是正确的换档操作。我的第一次可悲尝试涉及以下代码: int xy = 343423; const int mask = 0x00000000; byte b1, b2, b3, b4; b1 = (byte)((xy

目前,我正在使用BitConverter将两个无符号短裤打包到一个有符号整数中。这段代码针对不同的值执行数百万次,我认为代码可以进一步优化。下面是我目前正在做的事情——您可以假设代码是C#/NET

因此,我想到,如果我使用位移位,就可以避免构造数组的开销。但就我个人而言,我不知道什么是正确的换档操作。我的第一次可悲尝试涉及以下代码:

int xy = 343423;
const int mask = 0x00000000;
byte b1, b2, b3, b4;
b1 = (byte)((xy >> 24));
b2 = (byte)((xy >> 16));
b3 = (byte)((xy >> 8) & mask);
b4 = (byte)(xy & mask);
ushort m_X = (ushort)((xy << b4) | (xy << b3));
ushort m_Y = (ushort)((xy << b2) | (xy << b1));
int xy=343423;
常量整数掩码=0x00000000;
字节b1、b2、b3、b4;
b1=(字节)((xy>>24));
b2=(字节)((xy>>16));
b3=(字节)((xy>>8)和掩码);
b4=(字节)(xy和掩码);
ushort m_X=(ushort)((xy
intxy=343423;
ushort低=(ushort)(xy和0x0000ffff);
ushort高=(ushort)((xy&0xffff0000)>>16);

int xxyy=低+((int)高)最简单的方法是使用两个班次:

int xy = -123456;
// Split...
ushort m_X = (ushort) xy;
ushort m_Y = (ushort)(xy>>16);
// Convert back...
int back = (m_Y << 16) | m_X;
intxy=-123456;
//分开。。。
ushort m_X=(ushort)xy;
ushort m_Y=(ushort)(xy>>16);
//转换回。。。

返回整数=(在这种情况下,
uint
的转换是不必要的,因为当您转换到
ushort
@LukeH时,您正在删除符号扩展位。您是对的,我编辑了答案以删除不必要的转换。谢谢各位。这真是太棒了。我将在这里对其进行基准测试,看看它与使用位转换器的1M操作相比如何。让我们来看看你知道!//34ms用于10M操作的位移位;//959ms用于10M操作的位转换器
// 34ms for bit shift with 10M operations
// 959ms for BitConverter with 10M operations

static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();

        stopWatch.Start();
        for (int i = 0; i < 10000000; i++)
        {
            ushort x = (ushort)i;
            ushort y = (ushort)(i >> 16);
            int result = (y << 16) | x;
        }
        stopWatch.Stop();
        Console.WriteLine((int)stopWatch.Elapsed.TotalMilliseconds + "ms");

        stopWatch.Start();
        for (int i = 0; i < 10000000; i++)
        {
            byte[] bytes = BitConverter.GetBytes(i);
            ushort x = BitConverter.ToUInt16(bytes, 0);
            ushort y = BitConverter.ToUInt16(bytes, 2);

            byte[] xBytes = BitConverter.GetBytes(x);
            byte[] yBytes = BitConverter.GetBytes(y);
            bytes = new byte[] {
                xBytes[0],
                xBytes[1],
                yBytes[0],
                yBytes[1],
            };
            int result = BitConverter.ToInt32(bytes, 0);
        }
        stopWatch.Stop();
        Console.WriteLine((int)stopWatch.Elapsed.TotalMilliseconds + "ms");


        Console.ReadKey();
    }
int xy = 343423;
ushort low = (ushort)(xy & 0x0000ffff);
ushort high = (ushort)((xy & 0xffff0000) >> 16);
int xxyy = low + (((int)high) << 16);
int xy = -123456;
// Split...
ushort m_X = (ushort) xy;
ushort m_Y = (ushort)(xy>>16);
// Convert back...
int back = (m_Y << 16) | m_X;