4

我还有一个深夜脑死问题。做起来可能很简单,但你知道在 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 中?

谢谢!

4

2 回答 2

1

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

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

但是,您在问题末尾打印的数字的数字是从前到后的。如果这就是你想要的,那就是:

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

当然,这假设代码知道每个值的所需位长。如果您在编译时不知道位长,那么您必须在运行时跟踪它,否则单个 int1不会告诉您的代码从中使用多少位。

于 2012-12-02T09:54:37.083 回答
0

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

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 位整数一起使用,请将high和更改lowlong,并将两者都更改3163.

于 2012-12-02T13:39:21.443 回答