在STM32上指定位置沿阵列的有效位计算

时间:2018-04-13 22:24:30

标签: c arrays bit

我想知道是否有人知道有效的方法来计算沿阵列指定位置的位?

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以循环数组值并使用按位和运算符测试位,如下所示:

int arr[] = {1,2,3,4,5};
// 1 - 001
// 2 - 010
// 3 - 011
// 4 - 100
// 5 - 101

int i, bitcount = 0;

for (i = 0; i < 5; ++i){
    if (arr[i] & (1 << 2)){ //testing and counting the 3rd bit
        bitcount++;
    }
}

printf("%d", bitcount); //2

请注意,我选择1 << 2来测试右边第三位或第三个最低位,以便更容易显示。现在bitCount将保留2,这是设置为3rd的{​​{1}}位数。

Take a look at the result in Ideone

在您的情况下,您需要检查第5位,可以表示为:

  • 1
  • 1 << 4
  • 0x10000

第8位:

  • 16
  • 1 << 7
  • 0x10000000

所以调整到你的位会给你:

256

如果你需要计算其中的许多,那么这个解决方案并不是很好,你最好创建一个位数组,并用另一个int i, bitcount8 = 0, bitcount5 = 0; for (i = 0; i < your_array_size_here; ++i){ if (arr[i] & 0x10000000){ bitcount8++; } if (arr[i] & 0x10000){ bitcount5++; } } 循环计算它们: / p>

for

在这种情况下,您可以通过索引访问位计数:

int i, j, bitcounts[8] = {0};

for (i = 0; i < your_array_size_here; ++i){
    for (j = 0; j < 8; ++j){
        //j will be catching each bit with the increasing shift lefts
        if (arr[i] & (1 << j)){
            bitcounts[j]++;
        }
    }
}

Check this solution in Ideone as well

答案 1 :(得分:1)

假设OP想要计算有效位

size_t countbits(uint8_t *array, int pos, size_t size)
{
    uint8_t mask = 1 << pos;
    uint32_t result = 0;

    while(size--)
    {
        result += *array++ & mask;
    }
    return result >> pos;
}

答案 2 :(得分:1)

让比特位置差异(例如,在这种情况下为7 - 4)为diff

如果2 diff &gt; n,然后代码可以同时添加两个位。

void count(const uint8_t *Array, size_t n, int *bit7sum, int *bit4sum) {
  unsigned sum = 0;
  unsigned mask = 0x90;
  while (n > 0) {
    n--;
    sum += Array[n] & mask;
  }
  *bit7sum = sum >> 7;
  *bit4sum = (sum >> 4) & 0x07;
}

如果处理器具有快速乘法且n仍然不是太大,例如n < pow(2,14)。 (或者在一般情况下为n < pow(2,8)

void count2(const uint8_t *Array, size_t n, int *bit7sum, int *bit4sum) {
  // assume 32 bit or wider unsigned
  unsigned sum = 0;
  unsigned mask1 = 0x90;
  unsigned m = 1 + (1u << 11);  // to move bit 7 to the bit 18 place
  unsigned mask2 = (1u << 18) | (1u << 4);
  while (n > 0) {
    n--;
    sum += ((Array[n] & mask1)*m) & mask2;
  }
  *bit7sum = sum >> 18;
  *bit4sum = ((1u << 18) - 1) & sum) >> 4);
}

算法:代码使用掩码,乘法,掩码来分隔2位。低位保持在低位,而高位保持在高位。然后发生并行添加。

循环避免了循环本身之外的任何分支。这可以实现快速代码。 YMMV

如果n更大,请将其细分为多次调用count2()