gpt4 book ai didi

c# - 按位将 long 解包为两个数字

转载 作者:行者123 更新时间:2023-12-02 04:21:47 26 4
gpt4 key购买 nike

我正在努力将数据从长类型解压缩为两个数字。不知道我哪里出错了。

我通过将两个数字打包成一个长整数来创建一个唯一的数字:

    public static long Squeeze(float x, float y)
{
return ((long)x << 32) | (long)y;
}

所以 long 由 x 的 4 个字节和 y 的 4 个字节组成。

然后我试图用以下方法恢复数字:

float x = (float)(hash >> 32);
float y = (float)(hash | int.MaxValue); // this should be 1111 1111 1111 1111 i think

但它似乎不起作用,x 似乎是正确的,但 y 给了我不应该的数字。

它也需要适用于负数。

示例:

(2.0, 9.0) => Packed: 8589934601 => Unpacked: (2, 1.073742E+10)
(-1.0, -1.0) => Packed: -1 => Unpacked: (-1.0, -2147484000.0)

最佳答案

您应该使用BitConverter而不是强制转换:

public static long Squeeze(float x, float y)
{
var bytes = new byte[8];
BitConverter.GetBytes(x).CopyTo(bytes, 0);
BitConverter.GetBytes(y).CopyTo(bytes, 4);
return BitConverter.ToInt64(bytes, 0);
}

public static void Unpack(long value, out float x, out float y)
{
var bytes = BitConverter.GetBytes(value);
x = BitConverter.ToSingle(bytes, 0);
y = BitConverter.ToSingle(bytes, 4);
}

只要您不将字节数组传输出程序,系统使用小端还是大端字节顺序并不重要。如果需要了解可以查看BitConverter.IsLittleEndian .

关于c# - 按位将 long 解包为两个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59383237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com