【发布时间】:2015-03-11 06:56:56
【问题描述】:
早上好,不知道这个问题是否涉及到正确的 StackExchange 网络。如果不是请见谅。
我得到了一个十进制/整数标识符值,我需要将其拆分为三个单独的值。假设我们有程序 ABC。程序 ABC 正在使用以下公式生成十进制/整数标识符值:
int identifier = 0;
int unitTypeId = 1;
int boardId = 4;
int messageId = 20;
identifier = (((unitTypeId) << 8) | ((boardId) << 5) | (messageId));
identifier 现在包含一个基于位移和 OR 运算的值。
现在我们必须开发 Program CDE。程序 CDE 读出一个日志文件,其中包含十进制/整数标识符和一些其他值,这些值在这种情况下不是必需的。程序 CDE 必须将读取标识符拆分为三个值:
int unitTypeId = 1;
int boardId = 4;
int messageId = 20;
第一:有没有办法做到这一点?
我的第一次尝试看起来像这样,但老实说,我没有得到标识符所基于的原始值。
private void resolveIdentifier()
{
this.IdentifierBits = Convert.ToString(this.OriginIdentifier, 2); //Convert to binary in a string
// Message identifiers are constructed:
// Unit Type Bit 8-10
// Board ID Bit 5-7
// Unit Specific Message Ids Bit 0-4
int[] bits = this.IdentifierBits.PadLeft(11, '0') // Add 0's from left
.Select(c => int.Parse(c.ToString())) // convert each char to int
.ToArray(); // Convert IEnumerable from select to Array
Array.Reverse(bits);
for (int i = 0; i < bits.Length; i++)
{
int calcValue = i;
if (i < 5) // Message Id
{
this.MessageId += (int)Math.Pow(2, calcValue);
}
else if (i > 4 && i < 8)
{
calcValue -= 5;
this.BoardId += (int)Math.Pow(2, calcValue);
}
else
{
calcValue -= 8;
this.Unit += (int)Math.Pow(2, calcValue);
}
}
}
谁能告诉我我做错了什么以及是否有可能达到原始三个值?
【问题讨论】:
标签: c# .net bit-manipulation bit