首页 > 解决方案 > 将两个数字打包成一个 Int32

问题描述

我正在向连接的设备发送数据,并且出现了一个问题,即从设备返回的一个整数包含两个 id。一个封装在 10 个 LSB 位中,第二个封装在 22 个 MSB 位中。从本网站的帮助中,我找到了如何解析这两个数字(无论如何我相信这是正确的):

//10 LSB bits
var nodeID = source & 0x3FF; //mask 10 LSBs

//22 MSB bits: mask + bitshift
var companyID = (source & 0x3FFFFF) >> 10;

现在我需要从两个数字(分别为 10 位和 22 位)创建一个 int32 并再次需要一些方向。涉及的步骤是什么?

谢谢!

标签: c#bit-manipulation

解决方案


好吧,看来你有

   companyID  nodeID 
   <- 22  ->  <-10->

格式。如果是你的情况,你可以

var nodeID    = source & 0x3FF;            // Rightmost 10 bits: just mask
var companyID = (source >> 10) & 0x3FFFFF; // Move to the right, then mask 

请注意,companyID您应该首先将其向右移动以去除最左边的10( nodeID) 位:

最初的:

   companyID  nodeID 
   <- 22  ->  <-10->

移位( >> 10) 后:

   sssssssss companyID   
   sign bits <- 22  ->  

掩蔽后 & 0x3FFFFF):

   00..00 companyID == companyID  
   <-10-> <- 22  ->

撤销:

   var encoded = (CompanyID << 10) | nodeID

推荐阅读