LINUX.ORG.RU

Про телепатов уже знаешь?

devinull ★★
()
Ответ на: комментарий от r_asian

> Про телепатов уже знаешь?

Не знаю ;) Пишу библиотеку для устройства. Каждый пакет данных должен заканчиваться контрольной суммой, которая считается сложением без переноса всех байт посылки.

> Так сгодится :-)))?

Нет, это обычное сложение. Интересует сложение БЕЗ ПЕРЕНОСА(!). В Вашем примере c=0xC2, а при сложении без переноса должно получиться 0xB2.

hayova
() автор топика
Ответ на: комментарий от hayova

>>int a=0xAF;
>>int b=0x13;

>Нет, это обычное сложение. Интересует сложение БЕЗ ПЕРЕНОСА(!). В Вашем примере c=0xC2, а при сложении без переноса должно получиться 0xB2.

0xB2.. Хм?? А поясните, плз, для меня: что есть "сложение без переноса"
Может речь идет об "исключающем ИЛИ" aka XOR ??
Но тогда ответ будет 0xBC И, AFAIK, реализовать такой
контроль целостности байт-пакета на борту микроконтроллера
оч. просто, что обычно и делается..
А вот про "сложение без переноса" я что-то не понял. :-\
Культур-мультур, вероятно, низкий.. :)

braindef
()

#include <stdio.h>

#define SUMHB(a, b) (((a) + (b)) & 0x0F)
#define SUM_B(a, b) ((SUMHB((a) >> 4, (b) >> 4) << 4) | \
                     SUMHB((a), (b)))

int main(int argc, char **argv) {
  unsigned char a = 0xAF;
  unsigned char b = 0x13;

  unsigned char c = SUM_B(a, b);

  printf("c = %2.2x\n", c);

  return(0);
} /* main */

legk
()
Ответ на: комментарий от hayova

>В Вашем примере c=0xC2, а при сложении без переноса должно получиться 0xB2

Сложение по модулю 16?

#define MASKADD(a,b,mask) (((a & mask)+(b & mask)) & mask)

c = MASKADD(a,b,0x0f) | MASKADD(a,b,0xf0)

PS.

Прошу считать меня телепатом :)

anonymous
()
Ответ на: комментарий от legk

> =) а что это даёт ?

Ты на счёт краткости кода? Чем меньше кода, тем меньше ошибок, это первое. Второе - чем меньше кода, тем легче его читать.

ddo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.