Я думаю, что вы запутались между массивами и числами, в частности, что означает манипулирование двоичными числами.
Я расскажу об этом на примере.Скажем, у вас есть несколько сообщений об ошибках, и вы хотите вернуть их в виде возвращаемого значения из функции.Теперь вы можете обозначить свои ошибки 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) определенному значению и применяете бинарные операции, чтобы определить, установлены ли они, а затем оперировать ими.
Я также должен добавить, что бинарные операции близкив идее к базовой электронике компьютера.Представьте, соответствуют ли битовые поля выходным сигналам различных цепей (ток или нет).Используя достаточное количество комбинаций указанных цепей, вы делаете ... компьютер.