如何将8个4位值编码到Int32中,然后将它们取回?

Dar*_*ski 1 c# encoding 32-bit bit-manipulation bitwise-operators

如何在C#中将8 4bit(0..15或0..F,如果你喜欢hex;))值放入Int32(int)并将它们取回?我需要这些用于我正在编写的游戏,或者更具体地说,它是编辑器(它将以Notch失败的0x10c中的顶点操作为特征),并且由于已经有一些遗留代码和几个级别构建,我真的不能打破格式所以我可以使用Int64并使用BitConverter类编码8个8位值;).

我不是很擅长按位操作,那些试图向我解释这些的人到目前为止都失败了所以是的.需要帮忙.

Dmi*_*nko 7

其主要思想是使用左<<移位,并|编码&>>转向解码.假设值组织为数组:

 byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

 int result = data
   .Select((value, i) => value << (4 * i))
   .Aggregate((x, y) => x | y); // or just .Sum() - Jeppe Stig Nielsen's idea
Run Code Online (Sandbox Code Playgroud)

编辑: for循环实现:

 int result = 0;

 for (int i = 0; i < data.Length; ++i)
   result |= data[i] << (4 * i);
Run Code Online (Sandbox Code Playgroud)

为了检索index第值(index[0..7]范围)

 byte item = (byte) ((result >> (index * 4)) & 0xF);
Run Code Online (Sandbox Code Playgroud)