
No.8
- 回答日時:
>商と剰余を同時に求めることは可能なはずなので
x86では可能ですが、それが出来ないプロセッサもあります。(TRONチップがそうだったような。。)
Cは汎用言語なので、どんなプロセッサでも同じソースで動かなければならないので、こういう風になっているんだと思います。
x86環境ならインラインアセンブラで
void div(int a, int b, int *c, int *d)
{
_asm
{
mov eax, a
mov edx, 0
idiv b
mov ebx, [c]
mov ecx, [d]
mov [ebx], eax
mov [ecx], edx
}
}
main()
{
int a,b,c,d;
div(a, b, &c, &d);
}
#7様
除数と被除数の両方が定数で無い場合、最適化しても除算は2回になってしまうと思うのですが。。
除数が2,4,8..なら除算しないでシフトするだけかと思われます。
No.6
- 回答日時:
C++Builderの実装を見たんですが、div()はアセンブラで実装されてますね。
速そう。

No.5
- 回答日時:
1回の演算でできないのは、他の方々が言われているとおりです。
どうしても、1回でやりたい場合は、#3のかたのように関数を自作することになりますが、この程度の関数なら、マクロで実装することもできます。
------------------------------
//商と余りを同時に求める
#include <stdio.h>
#define MYDIV(HIJOSU,JOSU,SHO,AMARI)\
{\
SHO = HIJOSU / JOSU;\
AMARI = HIJOSU % JOSU;\
}
void main(void){
int sho1;
int sho2;
int amari1;
int amari2;
MYDIV(10,4,sho1,amari1)
MYDIV(10,-3,sho2,amari2)
printf("商=%d 余り=%d\n",sho1,amari1);
printf("商=%d 余り=%d\n",sho2,amari2);
}
-------------------------------
MYDIVのパラメータは被除数、除数、商、余りになっています。
被除数、除数を与えると商、余りが求められます。
商と余りを同時に必要とする演算が、ソースの中に大量に存在する場合は、このようなマクロを使用すると視認性は良くなります。
通常は、2回の演算を行う方法で十分かと思いますが・・・。

No.3
- 回答日時:
C の式は、一度に2つの変数に値を代入するのは不可能です。
(Perl ならできますが…)なので、どうしても商と剰余を同時に求めたいなら、次のような構造体を用意して、この構造体形式で値を返す(また、参照渡しでもいいのですが)関数でも書くしかないのではないでしょうか?
struct warizan {
int sho;
int amari;
};
struct warizan x;
struct warizan div(int a, int b)
{
static struct warizan res;
res.sho = a / b;
res.amari = a % b;
return (res);
}
main()
{
x = div(10, 3);
}
この回答への補足
説明不足で申し訳ありません。
時間短縮のために除算関数が2回呼ばれて演算時間
が浪費されているのをどうにかできないかなという
のが今抱えている本題です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(教育・科学・学問) 小学生の算数の商について 3 2023/03/06 14:11
- 簿記検定・漢字検定・秘書検定 日商簿記2級について 以前、試験を行っていて 分からない仕訳がありました 資本準備金(剰余金?)と利 1 2022/11/23 06:22
- 経済学 需要関数と供給関数がそれぞれ Y=D(p)=1000−p、Y=S(p)=2p−200で与えられている 2 2022/06/13 19:44
- 数学 数1 三角形ABCにおいて、a=2√3、b=2√2、A=60°の時 c、B、Cを求めよ。という問題で 4 2022/11/23 21:48
- 数学 x^nを(x-1)^2で割ったときの余りを求めよ 2 2022/04/23 16:08
- PHP PHP MySql ページング 2 2022/09/20 06:38
- 数学 写真の問題で剰余の定理を用いて、別解の手順から a=2 b=8と求まるところまではわかるのですが、な 2 2022/08/07 13:12
- 数学 代数の質問です 2 2022/04/30 14:10
- 数学 代数の問題です! 3 2023/06/04 14:01
- 簿記検定・漢字検定・秘書検定 株主総会において、資本金8.800.000を減少した。その他資本剰余金を同額増加させた上で、剰余金8 1 2023/01/18 19:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
式は定数値が必要です」という...
-
(int *)の意味
-
Cでボリュームコントロールを制...
-
main関数以外での結果の表示?
-
VB6.0でコンピュータ名の取得
-
四捨五入方法
-
ラップ関数とはどんなものですか?
-
実数の整数部,小数部の取得
-
int16_t の _t は何?
-
VBからのDLL呼び出しでエラー発生
-
VB.NET DLL 参照型String読込み
-
課題でつまってます・・・
-
C言語 エラーの原因がわからな...
-
インライン展開されているか確...
-
ソースコード void printBi(cha...
-
演算子オーバーロードのプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
int型の変数値をバイト列として...
-
std::set<int> で、ある値が何...
-
PowerShellがうまくいかない
-
(int *)の意味
-
CStringの配列要素を関数で受け...
-
ColorをRGBで指定する方法
-
「{ } で囲むだけ」は正しい?
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
read関数をノンブロッキングで...
-
(マルチスレッド)_beginthrea...
-
int16_t の _t は何?
おすすめ情報