Я думаю, что вы сами путаетесь между массивами и числами, в частности, что означает манипулировать двоичными числами.
Я расскажу об этом на примере. Скажем, у вас есть несколько сообщений об ошибках, и вы хотите вернуть их в возвращаемое значение из функции. Теперь вы можете наметить свои ошибки 1,2,3,4 ... что имеет смысл для вашего разума, но тогда как вы, учитывая только одно число, выясните, какие ошибки произошли?
Теперь попробуйте маркировать ошибки 1,2,4,8,16 ... увеличивающие мощности двух, в основном. Почему это работает? Ну, когда вы работаете с базой 2, вы управляете цифрой, как 00000000
, где каждая цифра соответствует мощности 2, умноженной на ее позицию справа. Итак, допустим, ошибки 1, 4 и 8 происходят. Ну, тогда это может быть представлено как 00001101
. Обратно, первая цифра = 1 * 2^0, третья цифра 1 * 2^2 и четвертая цифра 1 * 2^3. Добавление их всех дает вам 13.
Теперь мы можем проверить, произошла ли такая ошибка, применяя битовую маску. Например, если вы хотите поработать, если произошла ошибка 8
, используйте представление битов 8 = 00001000
. Теперь, для того, чтобы извлечь или не произошло, что ошибка, использовать двоичный и так:
00001101
& 00001000
= 00001000
Я уверен, что вы знаете, каким образом и работает или может вывести его из выше - рабочая цифра-накрест , если любые две цифры являются 1, то результат 1, иначе 0.
Теперь в C:
int func(...)
{
int retval = 0;
if (sometestthatmeans an error)
{
retval += 1;
}
if (sometestthatmeans an error)
{
retval += 2;
}
return retval
}
int anotherfunc(...)
{
uint8_t x = func(...)
/* binary and with 8 and shift 3 plaes to the right
* so that the resultant expression is either 1 or 0 */
if (((x & 0x08) >> 3) == 1)
{
/* that error occurred */
}
}
Теперь к практичности. Когда память была разреженной, а протоколы не обладали роскошью xml и т. Д., Было принято разделять поле так, чтобы его было так много. В этом поле вы назначаете различные биты (флаги, полномочия 2) на определенный смысл и применяете двоичные операции для вывода, если они установлены, а затем работают с ними.
Я также должен добавить, что бинарные операции близки по идее к базовой электронике компьютера. Представьте, если битовые поля соответствовали выходным сигналам различных цепей (несущих ток или нет). Используя достаточное количество комбинаций указанных схем, вы делаете ... компьютер.
BTW, это одна из областей, где C/C++ не работает. C++ имеет битовые векторы, а C - нет. В C вам придется писать свои собственные. Обращайтесь к C/C++ в C или C++. –