реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Сравнение больших чисел, 64 бита и больше, на языке С, сильно не пинать:)
Pyku_He_oTTyda
сообщение May 26 2006, 08:57
Сообщение #16


Профессионал
*****

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



Я и не обижаюсьsmile.gif, понимаю, что много непонятного... Вот я и учусь, мне удобнее учится на примерах, чем просто книгу читать.
Буду сейчас разбиратся на примере ваших кодов.
Всем спасибо! Отдельное спасибо _Bill и GetSmart.
Совершенно верно, индетификатор содержит шесть кодов, но это не принципиально, можно сравнивать хоть все девять.


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
_Bill
сообщение May 26 2006, 09:06
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



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

smile.gif Может, не в тему, но все же... На будущее, т.с.
О пользе рекламы косметики
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 26 2006, 09:16
Сообщение #18


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата
Совершенно верно, индетификатор содержит шесть кодов, но это не принципиально, можно сравнивать хоть все девять.

Конечно. Если у Вас есть эти 9 кодов. Вы привели только 6 байт. Главное не запутаться относительно чего сравнивать эти 6 или 9 байт.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 26 2006, 09:56
Сообщение #19


Профессионал
*****

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



11E6CAC00701 - это 9 кодов, строка printf("%-X",rom_codes[i][j]); выводит их в таком виде, то есть опускает незначащие нули, в нормальном виде выглядит так:
0x01, 0x1E, 0x06, 0xCA, 0x0C, 0x00, 0x00, 0x70, 0x01


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
otrog
сообщение May 26 2006, 10:05
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(_Bill @ May 26 2006, 13:06) *
smile.gif Может, не в тему, но все же... На будущее, т.с.
О пользе рекламы косметики

a14.gif Сам постоянно пользуюсь "//" а "/*" и "*/" по возможности убираю из немоих исходников.
А в DEC, судя по всему, работают люди от искусства - все бы так строили свои процессоры (это я про систему команд PDP-11) wink.gif .

Цитата(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 байт(кодов). А незначащих нулей в данных нет smile.gif . Любой ноль что-нибудь да значит wink.gif .


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 26 2006, 10:14
Сообщение #21


Профессионал
*****

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



01 равен 1 и в двоичной, и в десятичной, и в шестнадцатиричной


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
otrog
сообщение May 26 2006, 10:31
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



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


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2006, 12:27
Сообщение #23


Гуру
******

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



Цитата(_Bill @ May 26 2006, 12:06) *
smile.gif Может, не в тему, но все же... На будущее, т.с.
О пользе рекламы косметики

B.W.Kernighan, R.Pike "The Practice of Programming"
С моими размышлениями по выработке стиля совпало очень много, по этому :-)
может и понравилась очень :-)
Русский перевод ~ в 2000 году тоже был.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 26 2006, 12:41
Сообщение #24


Гуру
******

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



Цитата(_Bill @ May 26 2006, 15:34) *
Цитата(Pyku_He_oTTyda @ May 26 2006, 10:04) *

Цитата
GetSmart


Простите за назойливость, а не могли бы черкнуть пример на моем частном случае,
определить вот это значение: 11E6CAC00701
а то я плыву sad.gif

Код
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();                                    // :-(


--------------------
Go to the top of the page
 
+Quote Post
_Bill
сообщение May 26 2006, 13:06
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 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. В сумме будет ноль, хотя не совпадают два байта.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2006, 13:39
Сообщение #26


Гуру
******

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



Цитата(_Bill @ May 26 2006, 16:06) *
Вычитание не всегда даст корректный результат.

И так тоже не всегда! И это принципиальное ограничение. Заодно Вы всегда будете сравнивать ВСЮ память, хотя достаточно первого несравнения. Если хочется ускорять - переходите на сравнение (в зависимости от платформы) 32-16-и потом уже байтовых значений. В некоторых случах типа описанного, ускорение для несовпадающих значений даст сравнение с 'конца'.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
defunct
сообщение May 26 2006, 13:39
Сообщение #27


кекс
******

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



Код
#define FALSE 0
#define TRUE 1

char Match(char __flash *pattern, char *str, char size)
{
  for(char i=0; i < size; i++){
     if (pattern[i] != str[i])
         return FALSE;
  }
  return TRUE;
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2006, 13:44
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 26 2006, 13:53
Сообщение #29


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



2 prottoss
Можно и по-вашему. Иногда так бывает удобнее. Но со сложением разности Вы конечно сглючили. Как уже сказали лучше объединять через OR. В самом крайнем случае сумму объявить как INT, а разность байт специально обрезать до CHAR. Но всё-равно OR лучше.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
defunct
сообщение May 26 2006, 13:55
Сообщение #30


кекс
******

Группа: Свой
Сообщений: 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' указатели?

только для наглядности.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016