连接多个Int以形成一个更大的Int

时间:2012-12-02 09:46:05

标签: c# arrays int concatenation

我有另一个深夜脑死亡的问题。它可能很简单,但你知道它是如何经过8小时+编程后到达截止日期结束。 :)

这是我的问题..

我有一个长度为10的布尔数组,它在逻辑上被分成单独的部分来容纳4个不同的整数位数组(作为布尔值)。这是目标数组:

bool[] myArray = new bool[10]; 

以下是我要插入的4个整数:

int value1 = 3;  // 2 bits, myArray[0-1], 11
int value2 = 12; // 4 bits, myArray[2-5], 1100
int value3 = 2;  // 2 bits, myArray[6-7], 10
int value4 = 1;  // 2 bits, myArray[8-9], 01

myArray 最终应如下所示(注意第一个元素是位置0):

{(T,T),(T,T,F,F),(T,F),(F,T)}

然后最终我要做的是将 myArray 转换为int值:

0x1111001001 = 969

也许有更好的方法可以做到这一点,而不必使用布尔?所以让我在更广泛的意义上重新解释我的问题:

我如何 N int值连接到目标 int?

谢谢!

2 个答案:

答案 0 :(得分:1)

通常,将几个数字中的位组合成一个的常用方法是这样(使用值和位长作为示例):

var result = value1 | (value2 << 2) | (value3 << 6) | (value4 << 8);

但是,您在问题末尾打印的数字会将数字重新排在前面。如果这就是你想要的,那就是:

var result = value4 | (value3 << 2) | (value2 << 4) | (value1 << 8);

当然,这假设代码知道每个值的所需位长。如果您在编译时不知道位长,那么您必须在运行时跟踪它,否则像1这样的单个int将无法告诉您的代码可以使用多少位。

答案 1 :(得分:0)

这是尝试编写连接整数的binaray表示的代码,其中二进制表示中没有前导零。

static int Concat(int high, int low)
{
  // find location i of most significant bit of "low"
  int i;
  for (i = 31; i > -1; --i)
    if ((low & (1 << i)) != 0)
      break;

  if (i == 31)
    return low;
  return low & (high << (i + 1));
}

static int ConcatMany(IEnumerable<int> values)
{
  return values.Aggregate(Concat);
}

这应该像这样使用:

int concatOfTwoNumbers = Concat(3, 12);

var list = new List<int> { 3, 12, 2, 1, };
int concatOfList = ConcatMany(list);

当然,如果串联中的位数超过32位,则最高位“向下”到左侧。要与64位整数一起使用,请将highlow更改为long,并将31更改为63