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

标签 c# bit-manipulation

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

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

    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/

相关文章:

c - 获取最高有效半字节,无论 int 位长度和字节顺序如何

java - 不包含 00 的二进制序列的正则表达式

c# - 从 wcf 服务中的类继承

c# - 正确编码直接访问属性 C# 的支持字段

c# - 是否可以将其重构为单一方法

python - 使用字节移位解码编码的最佳方法

c# - XmlSerializer 和复杂的前缀

Ruby 按位异或 2 相同长度的 ascii 字符串

arm - 为什么 Clang 不对 AArch32 上的 __builtin_popcountll 使用 vcnt?

java - 我需要关于 Bit Twiddling 的帮助