Russian Qt Forum
Ноябрь 24, 2024, 01:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Простой алгоритм деления целого на 1000.  (Прочитано 10612 раз)
Waryable
Гость
« Ответ #15 : Февраль 18, 2011, 13:23 »

А почему вы сразу отмели такой вариант:
Код
C++ (Qt)
char MasVal[6];            
unsigned long long int MSecs = 0;    
memcpy(MSecs, MasVal, 6);
 
unsigned int Secs = MSecs / 1000;
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #16 : Февраль 18, 2011, 13:38 »

А почему вы сразу отмели такой вариант:
Код
C++ (Qt)
char MasVal[6];            
unsigned long long int MSecs = 0;    
memcpy(MSecs, MasVal, 6);
 
unsigned int Secs = MSecs / 1000;

А вы первый пост в теме читали?
Ну не поддерживает компилятор long long!
Код
C
...
printf("Size: %d", sizeof(long long));
 

Цитировать
...
Size: 4
...
« Последнее редактирование: Февраль 18, 2011, 13:40 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
brankovic
Гость
« Ответ #17 : Февраль 18, 2011, 14:20 »

Ну не поддерживает компилятор long long!

Вообще сам факт использования Borland C довольно забавен, особенно имея в подписи arch linux amd64 / win 7 Улыбающийся

2 Waryable: неправильно сработает memcopy на little-endian архитектурах (x86, amd64), у него big-endian порядок байт

вообще если скорость интересует, то надо не цикл разворачивать, а уменьшить число делений:

Код
C++ (Qt)
unsigned high = (buf [0] << 24) | (buf [1] << 16) | (buf [2] << 8) | buf [3];
unsigned low = (buf [4] << 8) | buf [5];
unsigned result = high / 1000 + ((high % 1000) << 16 + low) / 1000;
 
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #18 : Февраль 18, 2011, 15:22 »

Цитата: brankovic
Вообще сам факт использования Borland C довольно забавен, особенно имея в подписи arch linux amd64 / win 7 Улыбающийся
Ну просто есть железяка с процом 80188 и у неё на борту ROM DOS , вот надо это дело запрограммировать. Улыбающийся

Цитата: brankovic
вообще если скорость интересует, то надо не цикл разворачивать, а уменьшить число делений:
Не работает этот код.

Кстати, код Fat-Zer-а (см. Ответ #12 ) все-таки работает, если использовать маску 0x0000FFFF:
Код
C
...
secl += ((t[4] << 8) + t[5]) & 0x0000FFFF;
...
 
Это причуды компилятора Borland C 3x  - он заполняет в этом случае старшие байты значением 0xFFFFxxxx  а не нулями
« Последнее редактирование: Февраль 18, 2011, 15:26 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Fat-Zer
Гость
« Ответ #19 : Февраль 18, 2011, 17:08 »

Ну просто есть железяка с процом 80188 и у неё на борту ROM DOS , вот надо это дело запрограммировать. Улыбающийся
на такой железяке мой код скорей всего не пойдёт или будет работать медленно... я расчитывал, что есть 32-х битные регистры.

Цитата: kuzulis link=topic=16825.msg112573#msg112573
Цитата: brankovic
вообще если скорость интересует, то надо не цикл разворачивать, а уменьшить число делений:
Не работает этот код.

Кстати, код Fat-Zer-а (см. Ответ #12 ) все-таки работает, если использовать маску 0x0000FFFF:
Код
C
...
secl += ((t[4] << 8) + t[5]) & 0x0000FFFF;
...
 
Это причуды компилятора Borland C 3x  - он заполняет в этом случае старшие байты значением 0xFFFFxxxx  а не нулями
brankovic, тоже самое что у меня) хотя через | может и быстрей будет..
« Последнее редактирование: Февраль 18, 2011, 17:12 от Fat-Zer » Записан
brankovic
Гость
« Ответ #20 : Февраль 18, 2011, 18:34 »

Цитата: brankovic
вообще если скорость интересует, то надо не цикл разворачивать, а уменьшить число делений:
Не работает этот код.

скобочки забыл вокруг <<

Код:
((high % 1000) << 16)

но вообще 80188 там разве 4х-байтовые есть умножения и деления? Даже если есть тормозить должны.

brankovic, тоже самое что у меня) хотя через | может и быстрей будет..

Судя по тому, что от анроллинга циклов что-то убыстряется, оптимизатор совсем плохой. Тогда да, | будет быстрее.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #21 : Февраль 18, 2011, 18:36 »

Цитата: Fat-Zer
на такой железяке мой код скорей всего не пойдёт или будет работать медленно... я расчитывал, что есть 32-х битные регистры.
Прекрасно твой код работает. Медленно или быстро - хз , но факт в том, что оно быстрее в два раза чем код с флоатами.

Цитата: Fat-Zer
тоже самое что у меня) хотя через | может и быстрей будет..
Вот тут неизвестно что будет быстрее, или
1.
Код
C
   u32 h;
   ((u8 *)(&h))[3] = t[0];
   ((u8 *)(&h))[2] = t[1];
   ((u8 *)(&h))[1] = t[2];
   ((u8 *)(&h))[0] = t[3];
 

или
2.
Код
C
unsigned high = (buf [0] << 24) | (buf [1] << 16) | (buf [2] << 8) | buf [3];
 

Но склоняюсь к тому, что п.1 будет быстрее, т.к не нужно сдвигать и выполнять ИЛИ.

Записан

ArchLinux x86_64 / Win10 64 bit
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #22 : Февраль 18, 2011, 18:52 »

Цитировать
Прекрасно твой код работает. Медленно или быстро - хз , но факт в том, что оно быстрее в два раза чем код с флоатами.
Ну дык, i80188 - это ж 16-битный проц с 8-битной внешней шиной данных без FPU. Вся работа с float делается в режиме эмуляции)
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.406 секунд. Запросов: 23.