How can I store 4 8 bit coordinates into one integer (C#)?

老子叫甜甜 提交于 2021-02-05 09:40:52

问题


Lets say I have the following four variables: player1X, player1Y, player2X, player2Y. These have, for example, respectively the following values: 5, 10, 20, 12. Each of these values is 8 bits at max and I want to store them into one integer (32 bits), how can I achieve this?

By doing this, I want to create a dictionary, keeping count of how often certain states have happened in the game. For example, 5, 10, 20, 12 is one state, 6, 10, 20, 12 would be another.


回答1:


You can use BitConverter

To get one Integer out of 4 bytes:

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

To get the four bytes out of the integer:

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



回答2:


To "squeeze" 4 8 bits value in a 32 bit space, you need to "shift" the bits for your various values, and add them together.

The opposite operations is to "unshift" and use some modulo to get the individual numbers you need.




回答3:


Here is an alterantive:

Make a struct with defined packing. Expose:

  • The int32 and all 4 bytes at the same time
  • Make sure the apcking overlaps (i.e. int starts at 0, byte variables at 0, 1,2,3

Done.

And you can easily access and work with them WITHOUT a bitconverter et al and never have to define an array, which is expensive jsut to throw it away.




回答4:


You can place the values by shifting to the apropriate offset

Example:

// 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;


来源:https://stackoverflow.com/questions/62372466/how-can-i-store-4-8-bit-coordinates-into-one-integer-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!