我有一个严格的内存限制,不允许我分配堆内存,也不允许在堆栈上使用局部变量执行以下位操作。
我有两个整数值A
和B
(假设它们只是两个字节的值)。我想知道A & B
的结果是什么(例如通过A &= B
),然后将A
的原始值还原为A
。
由于不允许额外的内存,我不能临时存储A
的原始值。我可以简单地使用一系列位操作来恢复A
的值吗?
原因是我有一个很大的数据数组,我需要按位计算后的位,然后再计算。但我需要保留原始值,以便与其他值进行比较。实际数据位于堆分配非常昂贵的设备上。而且数据的长度是动态的,所以我不能声明一个局部变量来保存它的临时值。
这可能吗?如果是,我该怎么做?
最佳答案
您似乎认为需要复制整个数组,修改该副本,然后对其执行操作。那是不必要的。
对于数组的每个元素,calucateA & B
并将其存储在本地。然后计算设置的位数,并将其添加到运行总数中。
例如:
int count_bits_with_and(unsigned char *array, int size, unsigned char val)
{
int i, sum;
for (i=0, sum=0; i<size; i++) {
unsigned char v = array[i] & val;
int count = count_bits(v);
sum += count;
}
return sum;
}