【问题标题】:How do I uniquely store 4 ints in one int (C#)? [duplicate]如何在一个 int (C#) 中唯一地存储 4 个 int? [复制]
【发布时间】:2020-06-19 19:19:12
【问题描述】:

假设我有以下四个整数:

int a = 4;
int b = 5;
int c = 6;
int d = 7;

我想将这些值存储在一个 int 中:

int whole;

我将如何使用按位/移位操作来做到这一点?我试过了:

int whole = a + (b << 8) + (c << 16) + (d << 24);

但我不确定这是否会为整体创建唯一值,因为我还想从整体中检索整数。因此,如果我有,例如,whole = 5919835,我想取回 c 的值。

【问题讨论】:

  • 这不能是唯一的:你不能在 32 位中唯一地存储 128 位。
  • 但是如果整数值不能放在 8 位中怎么办?你最多可以存储 256 个
  • 您不能将 4 个 int 存储在单个 int 中。您可以在 int 中存储 4 个整数值,但您必须将它们的范围限制为每个 8 位。
  • 唯一有意义的方法是,如果您想将 4 个字节打包成一个 32 位整数。我怀疑已经有很多类似的问题了。还有一个内置函数BintConverter.ToUInt32。您可以使用BitConverter.GetBytes(UInt32) 来逆转这一点
  • 推荐:byte a = 4, b = 5, c = 6, d = 7; - 现在很明显,它们的范围允许这种用法,并且您避免了很多危险的溢出情况。

标签: c# .net bit-manipulation bit


【解决方案1】:

如果所有abcd 都在[0..255] 即如果它们实际上是 bytes:

 int whole = unchecked(a | (b << 8) | (c << 16) | (d << 24));

注意unchecked(当d &gt; 127 时,您可能会有整数溢出,因为int 是有符号整数)。从技术上讲,+ 可以,但|(按位或)似乎更具可读性。

反向:

a = whole & 0xFF;
b = (whole >> 8) & 0xFF;
c = (whole >> 16) & 0xFF;
d = (whole >> 24) & 0xFF;

【讨论】:

  • 位运算符应该是&amp; 而不是&amp;&amp;
猜你喜欢
  • 2015-05-01
  • 2016-11-24
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2020-06-07
  • 2020-03-19
  • 2012-11-28
  • 2011-11-17
相关资源
最近更新 更多