|
|
  |
Сравнение больших чисел, 64 бита и больше, на языке С, сильно не пинать:) |
|
|
|
May 26 2006, 08:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360

|
Я и не обижаюсь  , понимаю, что много непонятного... Вот я и учусь, мне удобнее учится на примерах, чем просто книгу читать. Буду сейчас разбиратся на примере ваших кодов. Всем спасибо! Отдельное спасибо _Bill и GetSmart. Совершенно верно, индетификатор содержит шесть кодов, но это не принципиально, можно сравнивать хоть все девять.
--------------------
Андрей Смирнов
|
|
|
|
|
May 26 2006, 09:06
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Pyku_He_oTTyda @ May 26 2006, 11:57)  Я и не обижаюсь  , понимаю, что много непонятного... Вот я и учусь, мне удобнее учится на примерах, чем просто книгу читать. Буду сейчас разбиратся на примере ваших кодов. Всем спасибо! Отдельное спасибо _Bill и GetSmart. Совершенно верно, индетификатор содержит шесть кодов, но это не принципиально, можно сравнивать хоть все девять.  Может, не в тему, но все же... На будущее, т.с. О пользе рекламы косметики
|
|
|
|
|
May 26 2006, 09:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360

|
11E6CAC00701 - это 9 кодов, строка printf("%-X",rom_codes[i][j]); выводит их в таком виде, то есть опускает незначащие нули, в нормальном виде выглядит так: 0x01, 0x1E, 0x06, 0xCA, 0x0C, 0x00, 0x00, 0x70, 0x01
--------------------
Андрей Смирнов
|
|
|
|
|
May 26 2006, 10:05
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
Цитата(_Bill @ May 26 2006, 13:06)   Может, не в тему, но все же... На будущее, т.с. О пользе рекламы косметики  Сам постоянно пользуюсь "//" а "/*" и "*/" по возможности убираю из немоих исходников. А в DEC, судя по всему, работают люди от искусства - все бы так строили свои процессоры (это я про систему команд PDP-11)  . Цитата(Pyku_He_oTTyda @ May 26 2006, 13:56)  11E6CAC00701 - это 9 кодов, строка printf("%-X",rom_codes[i][j]); выводит их в таком виде, то есть опускает незначащие нули, в нормальном виде выглядит так: 0x01, 0x1E, 0x06, 0xCA, 0x0C, 0x00, 0x00, 0x70, 0x01 Что еще за незначащие нули? По логике 11E6CAC00701 это 0x11, 0xE6, 0xCA, 0xC0, 0x07, 0x01. Т.е. 6 байт(кодов). А незначащих нулей в данных нет  . Любой ноль что-нибудь да значит  .
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
May 26 2006, 10:31
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
А дошло! У Вас изначально было "0x01, 0x1E, 0x06, 0xCA, 0x0C, 0x00, 0x00, 0x70, 0x01", А printf("%-X",rom_codes[i][j]); выдал "11E6CAC00701". Так? А я подумал, что наоборот - извиняйте  .
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
May 26 2006, 12:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(_Bill @ May 26 2006, 12:06)   Может, не в тему, но все же... На будущее, т.с. О пользе рекламы косметикиB.W.Kernighan, R.Pike "The Practice of Programming" С моими размышлениями по выработке стиля совпало очень много, по этому :-) может и понравилась очень :-) Русский перевод ~ в 2000 году тоже был.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 26 2006, 12:41
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(_Bill @ May 26 2006, 15:34)  Цитата(Pyku_He_oTTyda @ May 26 2006, 10:04)  Цитата GetSmart Простите за назойливость, а не могли бы черкнуть пример на моем частном случае, определить вот это значение: 11E6CAC00701 а то я плыву Код flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01}; // Код "таблетки" char buffer[9];
char Match(char flash *pat, char *bp, char n) { while (n--) { if (*pat++ != *bp++) // байты не совпали return FAIL; // - выход по ошибке } return OK; // Успешный выход } ................... // -- Вызов if (Match(pattern, buffer, sizeof pattern) == OK) // Наш код! Smile(); // :-) else // Ерунда какая-то Cry(); // :-( Привет всем. Код хорош но я бы выполнил его немного по другому) Можно делать не сравнение в цикле, а просто вычитание одного разрядного байта из другого, а результат хранить в общей сумме. В итоге если сумма не равна нулю, число не совпало, если равно нулю - число совпало с эталоном. Выйгрыш - меньше переходов при равенстве чисел и стабильность по времени исполнения кода, т.е. код всегда будет выполняться одинаковое число команд, что не мало-важно при работе с 1Ware. Конечно, мелочь, но нагляднее и приятнее))) : Код
flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01}; // Код "таблетки" char buffer[9];
/******************************************************************************** ************
функция сравнения двух n-байтных чисел
******************************************************************************** ************/
BOOL Match(char flash *pat, char *bp, char n) {
char sum = 0;
while (n) { sum += *pat++ - *bp++;
n--;
}
return sum;
}
// ИМХО на мой вкус код более нагляден и эффективен))) ................... // -- Вызов if (Match(pattern, buffer, sizeof pattern) == 0) // Наш код! Smile(); // :-) else // Ерунда какая-то Cry(); // :-(
--------------------
|
|
|
|
|
May 26 2006, 13:06
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(prottoss @ May 26 2006, 15:41)  Привет всем. Код хорош но я бы выполнил его немного по другому) Можно делать не сравнение в цикле, а просто вычитание одного разрядного байта из другого, а результат хранить в общей сумме. В итоге если сумма не равна нулю, число не совпало, если равно нулю - число совпало с эталоном. Выйгрыш - меньше переходов при равенстве чисел и стабильность по времени исполнения кода, т.е. код всегда будет выполняться одинаковое число команд, что не мало-важно при работе с 1Ware. Конечно, мелочь, но нагляднее и приятнее))) : Код
flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01}; // Код "таблетки" char buffer[9];
/************************************************************************
функция сравнения двух n-байтных чисел
*************************************************************************/
BOOL Match(char flash *pat, char *bp, char n) {
char sum = 0;
while (n) { sum += *pat++ - *bp++;
n--;
}
return sum;
}
// ИМХО на мой вкус код более нагляден и эффективен))) ................... // -- Вызов if (Match(pattern, buffer, sizeof pattern) == 0) // Наш код! Smile(); // :-) else // Ерунда какая-то Cry(); // :-( Ну, тогда уж лучше так Код flash char pattern[] = {0x11, 0xe6, 0xca, 0xc0, 0x07, 0x01}; // Код "таблетки" char buffer[9];
/****************************************************************
функция сравнения двух n-байтных чисел
****************************************************************/
BOOL Match(char flash *pat, char *bp, char n) { char sum = 0;
while (n) { sum |= *pat++ ^ *bp++; n--; } return sum; } Вычитание не всегда даст корректный результат. Допустим, в одном случае разность будет +1, в другом - -1. В сумме будет ноль, хотя не совпадают два байта.
|
|
|
|
|
May 26 2006, 13:44
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(defunct @ May 26 2006, 16:39)  Код if (pattern[i] != str[size]) } Что это было? Да и зачем было заменять естественные для 'C' указатели?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 26 2006, 13:55
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zltigo @ May 26 2006, 16:44)  Цитата(defunct @ May 26 2006, 16:39)  Код if (pattern[i] != str[size]) } Что это было? Опечатка? Цитата Да и зачем было заменять естественные для 'C' указатели? только для наглядности.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|