IPB

Здравствуйте, гость ( Вход | Регистрация )

26 страниц V  « < 24 25 26  
Reply to this topicStart new topic
> Языки программирования
tolich
сообщение 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 &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 он недоступен.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Lu...pa...gamhi...dho?
Go to the top of the pageAdd Nick
 
+Quote Post
FBX
сообщение 28 May 2020, 16:38
Сообщение #502

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




А можно поинтересоваться, почему нельзя использовать _udiv128?


--------------------
using namespace fbx;
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 28 May 2020, 17:15
Сообщение #503

😸🧡✊✌️
Сообщений: 16 023
Спасибо сказали: 2663 раза




Цитата(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;
}


--------------------
Я слежу за тобой!
* tolic.narod.ru

Lu...pa...gamhi...dho?


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
FBX
сообщение 30 May 2020, 00:53
Сообщение #504

🐓🐓🐓🐓🐓🐓🐓
Сообщений: 1 845
Спасибо сказали: 1570 раз




Понятно, не знал, что их только в VS 2019 добавили. Казалось что они давно там были.

Ну как вариант, написать на асме онлайн а потом скопировать машинный код в массив байт. Вызывать через обертку с reinterpret_cast. Ну это чтобы не цеплять отдельный компилятор для асма ради одной функции.


--------------------
using namespace fbx;


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 02 Jun 2020, 14:49
Сообщение #505

😸🧡✊✌️
Сообщений: 16 023
Спасибо сказали: 2663 раза




Будет возня с аргументами...
Цитата(FBX @ 30 May 2020, 00:53) *
отдельный компилятор для асма
Тащемта, "компилятор для асма" называется ассемблер.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Lu...pa...gamhi...dho?
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 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;

Кто не верит, может проверить через таблицу истинности или попробовать логически вывести.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Lu...pa...gamhi...dho?


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



Текстовая версия Сейчас: 19 April 2024 - 17:56
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика