![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#501
|
|
![]() 😸🧡✊✌️ Сообщений: 16 391 Спасибо сказали: 3221 раз ![]() |
Есть функция деления числа двойной длины на число одинарной длины:
CODE typedef UINT_PTR ucell; const ucell MAXUVALUE = MAXUINT_PTR; struct udcell { ucell lo, hi; udcell() = default; constexpr udcell(ucell lo, ucell hi) : lo(lo), hi(hi) {} }; bool mixed_divmod(udcell dividend, ucell divisor, udcell "ient, ucell &remainder) { const ucell highbit = MAXUVALUE & ~(MAXUVALUE >> 1); if (divisor == 0) return false; quotient.hi = dividend.hi / divisor; remainder = dividend.hi % divisor; quotient.lo = 0; bool carry = false; for (byte bit = 0; bit < cell_bits; ++bit) { carry = (remainder&highbit); remainder <<= 1; quotient.lo <<= 1; if (dividend.lo&highbit) remainder |= 1; if (carry || remainder >= divisor) { remainder -= divisor; ++quotient.lo; } dividend.lo <<= 1; } return true; } Есть ли способ проще (не используя _udiv64 / _udiv128, у меня VS 2017). Доп. условие - inline assembler тоже не годится, в режиме x64 он недоступен. -------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#502
|
|
![]() 🐓🐓🐓🐓🐓🐓🐓 Сообщений: 1 845 Спасибо сказали: 1570 раз ![]() |
А можно поинтересоваться, почему нельзя использовать _udiv128?
-------------------- using namespace fbx;
|
|
|
![]() ![]()
Сообщение
#503
|
|
![]() 😸🧡✊✌️ Сообщений: 16 391 Спасибо сказали: 3221 раз ![]() |
А можно поинтересоваться, почему нельзя использовать _udiv128? Цитата The _udiv128 intrinsic is available starting in Visual Studio 2019 RTM. у меня VS 2017. С ней я и сам могу написать. Или на ассемблере.Edit. Код bool mixed_divmod(udcell dividend, ucell divisor, udcell "ient, ucell &remainder)
{ if (divisor == 0) return false; #ifdef Win32 quotient.hi = _udiv64(dividend.hi, divisor, &remainder); quotient.lo = _udiv64(ULONGLONG(remainder)<<32|dividend.lo, divisor, &remainder); #else quotient.hi = _udiv128(0, dividend.hi, divisor, &remainder); quotient.lo = _udiv128(remainder, dividend.lo, divisor, &remainder); #endif return true; } -------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#504
|
|
![]() 🐓🐓🐓🐓🐓🐓🐓 Сообщений: 1 845 Спасибо сказали: 1570 раз ![]() |
Понятно, не знал, что их только в VS 2019 добавили. Казалось что они давно там были.
Ну как вариант, написать на асме онлайн а потом скопировать машинный код в массив байт. Вызывать через обертку с reinterpret_cast. Ну это чтобы не цеплять отдельный компилятор для асма ради одной функции. -------------------- using namespace fbx;
|
|
|
![]()
Сообщение
#505
|
|
![]() 😸🧡✊✌️ Сообщений: 16 391 Спасибо сказали: 3221 раз ![]() |
Будет возня с аргументами...
отдельный компилятор для асма Тащемта, "компилятор для асма" называется ассемблер.
-------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#506
|
|
![]() 😸🧡✊✌️ Сообщений: 16 391 Спасибо сказали: 3221 раз ![]() |
Тут мне надо было упростить одно условие. Абстрагируясь от смысла:
Код bool a, b, c; ... bool test; if (c) test = a || b; else test = a && !b; Упростив, получил: Код ... bool test = b ? c : a; Кто не верит, может проверить через таблицу истинности или попробовать логически вывести. -------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 20 July 2025 - 10:06 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|