gpt4 book ai didi

java - 将值打包成一个 int

转载 作者:搜寻专家 更新时间:2023-11-01 01:14:44 25 4
gpt4 key购买 nike

假设我有几个变量,比如苹果、橙子、香蕉

我有 8 个苹果、1 个橙子和 4 个香蕉。

是否有可能以某种方式将这些值转换为单个整数,并根据计算出的整数值恢复为原始值?

我在网上找到了一个例子。

int   age, gender, height;
short packed_info;
. . .
// packing
packed_info = (((age << 1) | gender) << 7) | height;
. . .
// unpacking
height = packed_info & 0x7f;
gender = (packed_info >>> 7) & 1;
age = (packed_info >>> 8);

但是当我输入随机数时,它似乎并没有正常工作。

最佳答案

怎么做

是的,你可以做到这一点。做到这一点的简单方法就是您现在正在做的,即将整数的不同位分配给不同的值。你的是这样的,对于 32 位 int:

|3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1     |      |             |
|1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 | 7 |6 5 4 3 2 1 0|
| Age |Gender| Height |

当您将值 8 向右移动时,您只是获取了数字的年龄部分。如果您将 7 向右位移并用 1 屏蔽它,即 value >>> 7 & 1,那么您会得到性别。如果你只是屏蔽掉底部的七位(即 value & 0x7F),那么你就得到了高度。

为什么它很脆弱

您的示例缺少一些重要的东西:值的范围。例如,高度值永远不能高于 127。如果您尝试存储 128 或更高的高度,那么您现在的书写方式将导致部分高度覆盖性别,因为您需要八位存储那么大的值。这就是随机数不起作用的原因。

以同样的方式,如果有人不小心输入了一个非零或非一的性别,那么它会弄乱部分年龄值,因为你不能一次存储这么高的数字.

在赋值中解决这个问题的方法是放入位掩码,如下所示:

packed_info = (((age << 1) | (gender & 1)) << 7) | (height & 0x7f);

这样做时,您可以确定性别不会覆盖年龄,高度也不会覆盖其他。但是,如果您输入的高度大于 127,它将使用 mod 127。

为什么你通常不应该

因为它容易出错,而且整数不会占用太多内存。你不能只记住它是一个 int 了,你需要记住位布局是什么样的。只保留三个 int 会更容易。

然而,当传输速度很重要时,这种事情仍然会发生。 (例如,数字电视或其他视频、数字音频、以太网协议(protocol)等)

关于java - 将值打包成一个 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550891/

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