[英]How can I quickly and accurately multiply a 64-bit integer by a 64-bit fraction in C#?
[英]How can I store 4 8 bit coordinates into one integer (C#)?
假设我有以下四个变量:player1X、player1Y、player2X、player2Y。 例如,它们分别具有以下值:5、10、20、12。这些值中的每一个最大为 8 位,我想将它们存储到一个 integer(32 位)中,我该如何实现呢?
通过这样做,我想创建一个字典,记录游戏中某些状态发生的频率。 例如,5、10、20、12 是一个 state,6、10、20、12 是另一个。
您可以使用BitConverter
要从 4 个字节中获取一个 Integer:
int i = BitConverter.ToInt32(new byte[] { player1X, player1Y, player2X, player2Y }, 0);
要从 integer 中获取四个字节:
byte[] fourBytes = BitConverter.GetBytes(i);
要在 32 位空间中“挤压”4 个 8 位值,您需要为各种值“移动”位,并将它们相加。
相反的操作是“取消移位”并使用一些模来获得您需要的单个数字。
这是一个替代方案:
用定义的包装制作一个结构。 暴露:
完毕。
而且您无需使用 bitconverter 等就可以轻松访问和使用它们,并且永远不必定义数组,这很昂贵,只是扔掉它。
您可以通过移动到适当的偏移量来放置值
例子:
// 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.