Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Языки программирования
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
tolich
Есть функция деления числа двойной длины на число одинарной длины:

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 &quotient, 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 он недоступен.
FBX
А можно поинтересоваться, почему нельзя использовать _udiv128?
tolich
Цитата(FBX @ 28 May 2020, 16:38) *
А можно поинтересоваться, почему нельзя использовать _udiv128?
Цитата
The _udiv128 intrinsic is available starting in Visual Studio 2019 RTM.
Цитата(tolich @ 28 May 2020, 07:06) *
у меня VS 2017.
С ней я и сам могу написать. Или на ассемблере.

Edit.
Код
bool mixed_divmod(udcell dividend, ucell divisor, udcell &quotient, 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;
}
FBX
Понятно, не знал, что их только в VS 2019 добавили. Казалось что они давно там были.

Ну как вариант, написать на асме онлайн а потом скопировать машинный код в массив байт. Вызывать через обертку с reinterpret_cast. Ну это чтобы не цеплять отдельный компилятор для асма ради одной функции.
tolich
Будет возня с аргументами...
Цитата(FBX @ 30 May 2020, 00:53) *
отдельный компилятор для асма
Тащемта, "компилятор для асма" называется ассемблер.
tolich
Тут мне надо было упростить одно условие. Абстрагируясь от смысла:
Код
bool a, b, c;
...
bool test;
if (c)
    test = a || b;
else
    test = a && !b;

Упростив, получил:
Код
...
bool test = b ? c : a;

Кто не верит, может проверить через таблицу истинности или попробовать логически вывести.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.