Как я могу получить частное и остаток за один шаг?

Возможный дубликат:
Разделить и получить Осталось в то же время?

Возможно ли получить как частное, так и остаток от целочисленного деления за один шаг, то есть без двойного выполнения целочисленного деления?


person dtech    schedule 29.11.2011    source источник
comment
Вы про результат деления? Это называется частным.   -  person R. Martinho Fernandes    schedule 30.11.2011
comment
ну, скажем, я вызываю 25% 10, что приводит к 5, потому что 2x10 = 20 и 5 - это остаток, то, что я хочу получить, это 2 из операции по модулю, возможно ли это?   -  person dtech    schedule 30.11.2011
comment
Некоторые процессоры и некоторые языки имеют эту возможность, см., Например, stackoverflow.com/ questions / 3895081 /   -  person Paul R    schedule 30.11.2011
comment
Большинство компиляторов (должны) оптимизировать что-то вроде int c = a % b; int d = a / b; в одну операцию (например, div на x86, который возвращает оба).   -  person Matthew Iselin    schedule 30.11.2011
comment
@ddriver, да, это частное.   -  person R. Martinho Fernandes    schedule 30.11.2011
comment
Что вы подразумеваете под одним шагом? Вы ищете единственную функцию для вызова? Вы ищете что-то, что генерирует единую инструкцию по сборке? Вы ищете что-то, что генерирует сборку, для выполнения которой требуется определенное количество тактов?   -  person Michael Price    schedule 30.11.2011


Ответы (2)


div сделает это. См. справочник и пример:

/* div example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
  div_t divresult;
  divresult = div (38,5);
  printf ("38 div 5 => %d, remainder %d.\n", divresult.quot, divresult.rem);
  return 0;
}

Вывод:

38 div 5 => 7, remainder 3.

РЕДАКТИРОВАТЬ:

Спецификация C говорит:

7.20 Общие коммунальные услуги

The types declared are size_t and wchar_t (both described in 7.17),
div_t
which is a structure type that is the type of the value returned by the div function,
ldiv_t
which is a structure type that is the type of the value returned by the ldiv function, and
lldiv_t
which is a structure type that is the type of the value returned by the lldiv function.

... но не говорится, что такое определение div_t.

person John Dibling    schedule 29.11.2011
comment
@ddriver: Да, но посмотрите мою правку. - person John Dibling; 30.11.2011
comment
да спасибо большое за развернутый ответ - person dtech; 30.11.2011
comment
К вашему сведению. GLIBC-реализация div просто выполняет деление по модулю, так что вы ничего не получаете. Фактически, вы получаете накладные расходы на вызов функции. - person Mike Steinert; 30.11.2011
comment
@MikeSteinert: Это зависит от вашей архитектуры - например, в glibc есть реализация сборки div для Alpha - person caf; 30.11.2011

Да, есть стандартная функция под названием div()ldiv, а может, даже lldiv), которая Является ли это.

person Greg Hewgill    schedule 29.11.2011