В C, это может быть что-то вроде этого:
unsigned arr[] = { 12, 9, 9, 3 }; // values to loop through
unsigned len = sizeof(arr)/sizeof(arr[0]); // # of values
unsigned result = 0; // collect result here
unsigned bits = sizeof(arr[0]) * 8; // number of bits to consider
unsigned threshold = len/2 + ((len & 1) ? 1 : 0); // minimum # of 1 to get a 1
unsigned bit = 1 << (bits - 1); // bit mask; point to most significant bit position
for (unsigned pos = 0; pos < bits; pos++) {
unsigned ones = 0;
for (unsigned i = 0; i < len; i++) {
if ((bit & arr[i]) != 0) {
ones++;
}
}
result = (result << 1) + ((ones >= threshold) ? 1 : 0);
bit = bit >> 1;
}
printf("\n%d\n", result);
Внешний контур сдвигает битовую маску из наиболее незначимых к наименее значимым концу. Внутренняя петля подсчитывает биты, установленные на 1. Если 1 бит превышает пороговое значение, в результат сдвигается 1. В противном случае значение 0 сдвигается. В конце результат имеет большинство бит в соответствии с запросом.
Это может быть дополнительно оптимизировано, но не должно обеспечивать удобочитаемость.
Упрощенная для специального случая LEN == 4
unsigned arr[] = { 12, 9, 9, 3 }; // values to loop through
unsigned len = sizeof(arr)/sizeof(arr[0]); // # of values
unsigned result = 0; // collect result here
// for len==4, majority means that 2 or more bits are 1
for (unsigned i = 0; i < len - 1; i++)
for (unsigned j = i + 1; j < len; j++) {
result = result | (arr[i] & arr[j]);
}
printf("\n%d\n", result);