【问题标题】:How can I store 4 8 bit coordinates into one integer (C#)?如何将 4 个 8 位坐标存储到一个整数(C#)中?
【发布时间】:2020-10-03 22:26:24
【问题描述】:

假设我有以下四个变量:player1X、player1Y、player2X、player2Y。例如,它们分别具有以下值:5、10、20、12。这些值中的每一个最大为 8 位,我想将它们存储到一个整数(32 位)中,我该如何实现呢?

通过这样做,我想创建一个字典,记录游戏中某些状态发生的频率。例如,5、10、20、12 是一种状态,6、10、20、12 是另一种状态。

【问题讨论】:

  • 是否有您不想使用byte 类型的具体原因?或者您可能不知道这种类型?
  • 这听起来有点像作业,所以我不会直接回答这个问题,而是问你另一个可能对你有帮助的问题:使用笔和纸,你如何在范围内存储四个十进制数字从 0 到 99 在一个带 8 个小数位的小数内?您将如何将它们提取回来?

标签: c# bit-manipulation bitwise-operators 32bit-64bit


【解决方案1】:

您可以使用BitConverter

从 4 个字节中取出一个整数:

int i = BitConverter.ToInt32(new byte[] { player1X, player1Y, player2X, player2Y }, 0);

从整数中取出四个字节:

byte[] fourBytes = BitConverter.GetBytes(i);

【讨论】:

    【解决方案2】:

    要在 32 位空间中“挤压”4 个 8 位值,您需要为各种值“移动”这些位,并将它们相加。

    相反的操作是“取消移位”并使用一些模来获得您需要的单个数字。

    【讨论】:

    【解决方案3】:

    这是一个替代方案:

    用定义的包装制作一个结构。公开:

    • int32 和所有 4 个字节同时进行
    • 确保 apcking 重叠(即 int 从 0 开始,字节变量从 0、1、2、3 开始

    完成。

    而且您无需使用 bitconverter 等就可以轻松访问和使用它们,并且永远不必定义数组,这很昂贵,只是扔掉它。

    【讨论】:

      【解决方案4】:

      您可以通过移动到适当的偏移量来放置值

      例子:

      // Composing
      byte x1 = ...;
      byte x2 = ...;
      byte x3 = ...;
      byte x4 = ...;
      
      uint x = x1 | (x2 << 0x8) | (x3 << 0x10) | (x4 << 0x18);
      
      // Decomposing
      uint x = ...;
      
      byte x1 = x & 0xFF;
      byte x2 = (x >> 0x8) & 0xFF;
      byte x3 = (x >> 0x10) & 0xFF;
      byte x4 = (x >> 0x18) & 0xFF;
      

      【讨论】:

        猜你喜欢
        • 2019-08-18
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 2019-11-16
        • 2017-12-01
        • 2012-05-01
        • 2016-09-15
        • 1970-01-01
        相关资源
        最近更新 更多