Языки программирования |
Здравствуйте, гость ( Вход | Регистрация )
Языки программирования |
28 May 2020, 07:06
Сообщение
#501
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2663 раза |
Есть функция деления числа двойной длины на число одинарной длины:
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 он недоступен. -------------------- |
|
|
28 May 2020, 16:38
Сообщение
#502
|
|
🐓🐓🐓🐓🐓🐓🐓 Сообщений: 1 845 Спасибо сказали: 1570 раз |
А можно поинтересоваться, почему нельзя использовать _udiv128?
-------------------- using namespace fbx;
|
|
|
28 May 2020, 17:15
Сообщение
#503
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2663 раза |
А можно поинтересоваться, почему нельзя использовать _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; } -------------------- |
|
|
30 May 2020, 00:53
Сообщение
#504
|
|
🐓🐓🐓🐓🐓🐓🐓 Сообщений: 1 845 Спасибо сказали: 1570 раз |
Понятно, не знал, что их только в VS 2019 добавили. Казалось что они давно там были.
Ну как вариант, написать на асме онлайн а потом скопировать машинный код в массив байт. Вызывать через обертку с reinterpret_cast. Ну это чтобы не цеплять отдельный компилятор для асма ради одной функции. -------------------- using namespace fbx;
|
|
|
02 Jun 2020, 14:49
Сообщение
#505
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2663 раза |
Будет возня с аргументами...
отдельный компилятор для асма Тащемта, "компилятор для асма" называется ассемблер.
-------------------- |
|
|
06 Apr 2021, 19:37
Сообщение
#506
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2663 раза |
Тут мне надо было упростить одно условие. Абстрагируясь от смысла:
Код bool a, b, c; ... bool test; if (c) test = a || b; else test = a && !b; Упростив, получил: Код ... bool test = b ? c : a; Кто не верит, может проверить через таблицу истинности или попробовать логически вывести. -------------------- |
|
|
Текстовая версия | Сейчас: 19 April 2024 - 17:56 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |