我有另一个深夜脑死亡的问题。它可能很简单,但你知道它是如何经过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?
谢谢!
答案 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位整数一起使用,请将high
和low
更改为long
,并将31
更改为63
。