07.04.2019, 03:53
|
|
Частый гость
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Проверка данных
Всем добра.
Нужна помощь в реализации проверки данных на ардуинке.
Есть массив байт byte data[4];
Нажмите, чтобы открыть спойлер
0 1 0 1 0 1 1 0 байт0
0 1 0 1 1 0 1 0 байт1
0 0 1 1 0 1 1 1
1 0 0 0 0 1 1 0
1 1 0 0 0 1 1 1 байт4
Нужно проверить на четность столбцов нибблов тоесть:
Нажмите, чтобы открыть спойлер
байт0
0 1 0 1
0 1 1 0
байт1
0 1 0 1
1 0 1 0
0 0 1 1
0 1 1 1
1 0 0 0
0 1 1 0
байт4
1 1 0 0
0 1 1 1
сумма столбца 1 = 3 - нечетное, результат 1.
В итоге должно получиться
1 1 0 1
|
|
|
|
07.04.2019, 05:26
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: Проверка данных
Таки есть команда сдвига.
Имеем в двух байтовых переменных 0b10000000 и 0b00001000
Для каждого байта выполняем логическое И с каждой из переменных.
В переменной результата при совпадении инвертируем соответствующий бит (битовое сложение без переноса).
По завершении входного потока сдвигаем переменные маски вправо и повторяем.
Для экономии на циклах можно все сравнения по маскам прописать статически.
Немного больше кода, но один цикл.
В один if только одну проверку! Иначе при ИЛИ возможен вариант и одной, и двух единиц, а при истине инверсия будет только одна.
0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01 - все варианты масок.
Каждая нечетная и ее инверсия (0x70, 0xB0, 0xD0, 0xE0) для добавления 1 без переноса:
Если по маске 1 - выполнить И инверсной маской, иначе выполнить маской ИЛИ.
Формально XOR, но его нет в битовом варианте на C
Для использования XOR можно использовать массив из 4х байт для операций XOR напрямую с последующим ИЛИ всех значений в конце.
Стоит почитать книги по численным методам - там такое разбирается в самом начале, заодно литературу по устройству разнообразных АЛУ неплохо посмотреть в реализации логических и арифметических операций.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 07.04.2019 в 05:30.
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
07.04.2019, 07:32
|
|
Частый гость
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проверка данных
Сообщение от mike-y-k
|
В один if только одну проверку! Иначе при ИЛИ возможен вариант и одной, и двух единиц, а при истине инверсия будет только одна.
0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01 - все варианты масок.
|
Решил сделать так
Нажмите, чтобы открыть спойлер
Код:
|
void check_summ(byte tram[5])
{
const byte mask[] = {0x80, 0x20, 0x40, 0x10, 0x08, 0x02, 0x04, 0x01};
int op[3];
for (int o = 0; o ‹ 5; ++o)
{
for (int g = 0; g ‹= 3; ++g)
{
if (mask[g] == (tram[o] & mask[g]))
++op[g];
if (mask[g + 4] == (tram[o] & mask[g + 4]))
++op[g];
}
}
for (int pk = 0; pk ‹ 4; ++pk)
{
Serial.print(op[pk] % 2);
Serial.print(" ");
}
} |
но выдает чет совсем не то
Последний раз редактировалось GrafGrigorio; 07.04.2019 в 07:43.
|
|
|
|
07.04.2019, 16:13
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: Проверка данных
А какой результат у операции a && b?
Его вполне достаточно для сравнения по маске.
И результат таки битовыми операциями реализовать.
if (tram[o] && 0x80) summ_bit_acc = summ_bit (summ_bit_acc, 0x80, 0x70);
И так ещё 7 строчек с разными масками.
В summ_bit записать алгоритм однобитного сложения и возврат результата.
Из подпрограммы check_summ вернуть значение summ_bit_acc.
Если уж отлаживаться на консоли, то выводить на неё все шаги, а не только результат.
Делать в временное поле нормальный sprintf со всеми нужными данными и идентификатором точки вывода, а с полученным уже в консоль.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
07.04.2019, 20:52
|
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 434
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Проверка данных
Сообщение от mike-y-k
|
Формально XOR, но его нет в битовом варианте на C
|
uint8_t a,b,c;
a=????
b=a‹‹4;
c=a^b;
В старшем полубайте c - 1 если не чет. И так 5 раз. Потом все результаты между собой.
|
|
|
Сказали "Спасибо" sat_art
|
|
|
07.04.2019, 22:49
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Проверка данных
Код:
|
temp = data[0] ^ data[1] ^ data[2] ^ data[3] ;
temp1=(temp&0x0F);
temp=temp››4;
temp=temp^temp1; |
Последний раз редактировалось DmitriyVDN; 08.04.2019 в 00:05.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо DmitriyVDN за это сообщение:
|
|
|
07.04.2019, 23:39
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: Проверка данных
DmitriyVDN, наконец-то в теме кто-то написал почти правильно.
Хотя в данном случае ТС было бы полезней разобрать работу с такими данными на масках и в цикле. Специально про XOR "загнул" .
Оптимальнее всего вариант с накоплением в цикле ^= и потом по итогу ^= со сдвигом на 4 и & с 15
Так на любом размере буфера будет работать сразу и можно в собственную библиотеку занести вариант.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
07.04.2019, 23:48
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Проверка данных
фраза "почти правильно" правильно понравилась.
для четырех байт цикл нах не нать
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
07.04.2019, 23:59
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: Проверка данных
DmitriyVDN, в другой теме от ТС длина данных несколько иная.
И готовая подпрограмма (универсальный вариант и конечно на указателях ) для собственной библиотеки сильно выгоднее.
Но это уже к вопросу о фломастерах
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
08.04.2019, 06:04
|
|
Частый гость
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проверка данных
Ура победил
Всем спасибо!
Нажмите, чтобы открыть спойлер
Код:
|
void check_summ(byte tram[]) //tram массив с байтами
{
const byte mask[] = {0x80, 0x40, 0x20, 0x10,
0x08, 0x04, 0x02, 0x01};
int op[4] = {0, 0, 0, 0};
for (int o = 0; o ‹ 5; ++o)
{
for (int gi = 0; gi ‹ 4; ++gi)
{
byte buf1 = tram[o] & mask[gi];
byte buf2 = tram[o] & mask[gi + 4];
if (buf1 == mask[gi])
++op[gi];
if (buf2 == mask[gi + 4])
++op[gi];
}
}
Serial.println();//вывод результата
for (int pk = 0; pk ‹ 4; ++pk)
{
Serial.print(op[pk] % 2);
Serial.print(" ");
}
Serial.println();
} |
А по сути у меня кривой начальный массив был поэтому бадался
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:12.
|
|