1 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:14:51 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.46【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1198755167/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
313 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:27:01 ] >>310 >>308 ネタだろうが、それはない iteratorでなくとも Cの場合でもループの不変な表明を考えた場合 != を使うべきことは非常に多い。 i != NUMS の場合、ループ終了後はi == NUMS であることが保障される。 が、i >= NUMS だとそうはいかない。
314 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:30:13 ] どっちが速いの?
315 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:36:47 ] >>314 変わらないだろ。 0との比較は速い場合がある。 for(int i=10; i; i--) { ... } // 10回ループ
316 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:48:01 ] たまに数字飛ばしたりするからi>0って書くな
317 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:48:47 ] >>315 まさか、Javaでもあるまいし普通のコンパイラは速度差がないコードを吐くと思うぞ。
318 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:52:24 ] for(unsigned int i=10; i>0; i--) { cout << i << endl; } →期待通り for(unsigned int i=10; i>=0; i--) { cout << i << endl; } →無限ループ 理由、 unsignedの値はmax→→→→→→0→maxになる。 上のループだと偽(i==0)があらわれる。下のループだと常に真だから無限。 おk?
319 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:53:20 ] >>318 お前は少し上のレスも読めないのか
320 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:55:28 ] >>317 0との比較はゼロフラグを使えるので、効率が良い。 アセンブラの話な。 もちろん、命令パイプラインの効果で差が無くなるかもしれないが、 「場合がある」ということで。
321 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:56:48 ] >>319 言われて見れば同じ事言ってるw つうか微妙に違う事言ってるのかと思って。 >>319 のような言葉でしっかり確信持てることもある。 ということで、言葉は人をなめてるが実は優しい>>319
322 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:25:21 ] >>320 その話を知ってからいろんな環境で実験したけど未だに実感できたことがない。 ハンドアセンブルするような環境ならそりゃ違うけど・・・
323 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:32:33 ] >>322 だって期待できるコード削減量って ループ1回につき比較命令1つ程度なんだから、 実感は難しいかなあ。
324 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:40:25 ] いや、実験はそりゃ億とか兆とかするよ? CPUの周波数がわかってれば期待できる短縮時間は予測できるじゃん? んでも、どんだけ回しても測定誤差程度の値しか出ないんだよ・・・逆転も往々にしてあるし。
325 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:43:08 ] なんか自分で書いててアセンブラで比較してステート数確認すりゃいいじゃんとか思ってしまった・・・
326 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:45:59 ] アセンブリ吐いて比較してるよね? 場合によっては逆順に最適化されることもあると聞いた事あるが。
327 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 01:02:26 ] >>306 規格でsize_tは符号なしと決まっている。
328 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 02:08:21 ] VC9なんですけど #define WIDEN2(x) L ## x #define WIDEN(x) WIDEN2(x) #define __WFILE__ WIDEN(__FILE__) このマクロをもっと圧縮できませんか? 二行くらいに。
329 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 02:15:54 ] できないから3行なんだ。 #define WIDEN(x) L#x #define __WFILE__ WIDEN(__FILE__) VC9を持ってないからこれがコンパイル通らなきゃ不可能。 ってか通ったところでほかの環境でも通るとは限らないが。
330 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 02:19:00 ] 真ん中飛ばせる希ガス
331 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 02:30:20 ] みり
332 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 03:03:03 ] switchでcaseが大量にあるときに、 高速化を狙って関数ポインタの配列に するって手があると思うんですが、 ポインタ関数の呼び出しのオーバーヘッドは case何回くらいに匹敵するんでしょうか? 皆さんだったらcase何回くらいからポインタ関数 配列に換えますか?
333 名前:必要なら実測するのみ mailto:sage [2008/01/22(火) 03:09:58 ] >>332 case by case.
334 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 03:11:00 ] >>332 そういう風に出来る switch は 普通はジャンプテーブルに最適化されるから 気にしなくてもいいぜ。 関数ポインタを使うのは高速化を目的とするものじゃなくて、 実装の利便性やら可読性やらを目的とするもんだ。
335 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 03:13:25 ] >ジャンプテーブルに最適化される そうだったのか!w わざわざ変えてたのは無駄だったんですね。
336 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 03:17:03 ] 実は、関数テーブルではなくジャンプテーブルなので、手動で関数テーブルにするより高速。
337 名前:デフォルトの名無しさん [2008/01/22(火) 03:28:00 ] >>332 実際は、ifで分岐を書いた方が高速 もし等確率で起こるならcaseの最適化がifより速くなることもあるが CPUには分岐予測があり、30%くらいを占める分岐があればそれを始めに判定することでかなり速くなる
338 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 03:31:04 ] テーブルにアクセスする時間との兼ね合いで ジャンプテーブルに最適化するかどうか 決めてたりしないのか? コンパイラは。
339 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 03:33:00 ] >>337 分岐数が100とか1000とかに達するような場合でも CPUの分岐予測って効果あるんですか?
340 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 03:40:54 ] 既存のクラスParentを新しいクラスChildに継承させたいのですが、Parentに規定のコンストラクタがなく、必ず引数を必要とする場合の子クラスのコンストラクタの書式が分かりません。 親切な方、どうか助けて下さい。
341 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 03:46:18 ] 初期化子つけりゃいいだけじゃん
342 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 05:29:02 ] >>341 初期化子に親クラスで定義されている変数を引数として使えないことを知らなかった… 親クラスに少し手を加えて自己解決しました
343 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 08:50:36 ] 勘違いしてる悪寒
344 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 10:23:40 ] wchar_tについて質問です。 実装によってはwchar_tのサイズは2byteなようですが、これはサロゲートペアは どのような扱いになるのでしょうか? 1.サロゲートペアは見なかったことにする。結果サロゲートペアが必要な文字は文字化けする。 2.サロゲートペアも適切に処理。結果文字列の長さが変わる。
345 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 11:29:00 ] 初心者です。ある多元配列をkaiseki.cvsで与えた時に それの行と列を入れ替えるようなプログラムを考えています。 教科書を見たところ、1次元配列についてはfgets,fgetcを使えばいいという事はわかったのですが 多元配列になると、そもそもfgetsがどういうタイミングで一行を読み取るのかよくわかっていないので for文の中にどうやって組み込めばいいのかわからず、さらには読み取ったものを どうやって多元配列になおせばいいのかわかりません。 とりあえず自分で試行錯誤してみたのを張っておきます ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5857.txt
346 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 12:18:45 ] fgetsは改行までを読み込むんだよ。
347 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 12:54:32 ] 取り敢えず、kaiseki.cvsなんて名前はやめよう。誤解の元だ。
348 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 12:59:32 ] >>328 #define AL2TL(x) TEXT(##x##) #define __TFILE__ AL2TL(__FILE__) とか
349 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 13:13:53 ] VC2008で、「where」という単語使うと 予約語みたいで青くなるんですけど。 .NETの予約語みたいなんで使ってもいいですか?
350 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 13:19:14 ] >>344 wchar_tの中身がUnicodeとは限らないので、その質問は一般的には無意味。 で、Windows環境は確かにwchar_tは2バイトなんだけど、サロゲートペア が問題になるかどうかはどういう処理をするかに依存するので、やるこ とをもっと具体的に書いたほうがいいかも。
351 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 13:21:48 ] 言語周りのAPIなり何なりに任せるしかないんじゃね?
352 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 14:18:45 ] 文字数を数えたいときって,サロゲートペア以外に 合成文字も考えなきゃだめだよね? もう,ウンコでそう.
353 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 15:22:27 ] もう1文字8バイトにしちゃいなYO
354 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 18:39:31 ] >>349 whereは予約語になる予定だったが よく使われていたので却下された。よって使ってよし
355 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 19:09:07 ] みんな大好きデバナガリ
356 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 19:38:53 ] あなたも私も結合音節
357 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 22:06:55 ] >>350 確かに仕様ではwchar_tの中身もサイズも未定義でした。すいません。 やりたいことは、UTF-8のテキストをFreeTypeに突っ込みたいのですが、よくよく考えたら FT_Get_Char_Indexの引数はFT_ULongで32ビットでした。 サロゲートペア関係ありませんでしたねOTL
358 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 15:19:28 ] #define max(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ ←これ _x > _y ? _x : _y; } ) 上記の4行目だけ良く判りません。 これは、変数_x と _y の格納場所アドレスが同じ場合、 真(1)になるという意味だと思いますが、文がここで終わって まして、このような場合どのように解釈されるんでしょうか?
359 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 15:33:22 ] 型が違う場合に(intとdoubleのmaxとか)コンパイルエラーを起こさせて 落とすための仕掛けじゃないかという気がする。確かめたわけじゃ ないからほんとにそうなるかわかんないけど。
360 名前:358 mailto:sage [2008/01/23(水) 15:53:12 ] gcc 3.4.4 で int と long 型の変数を max に与え、4行目のあり・なしでコンパイルしてみた所、 確かにありの場合だけ warning: comparison of distinct pointer types lacks a cast が出ました。なるほどー ちなみに、_x > _y でも比較を行っていると思うのですが、ここでは弾かれないんですね…
361 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 15:55:44 ] 数値の比較は暗黙の型変換されるからね。 ポインタだとそれがない。
362 名前:358 mailto:sage [2008/01/23(水) 16:03:06 ] よく分かりました。ありがとうございました。
363 名前:デフォルトの名無しさん [2008/01/24(木) 13:08:33 ] cabファイルに、ファイルを追加圧縮したいのですが、DLLの説明書には出来ないとあります しかしアーカイバで対応しているものがあります C言語ではどのようにやればいいのかわかりますか
364 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 13:13:15 ] 一旦どこかに展開してから再圧縮してるのでは。
365 名前:デフォルトの名無しさん [2008/01/24(木) 13:15:21 ] そうみたいです ありがとうございます
366 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:25:20 ] 昔のVCの話ですが。
367 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:25:38 ] めでたし、めでたし。
368 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:29:54 ] 日本語のWindows98で動くプログラムは_MBCS指定しますか?
369 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 16:00:55 ] ケースバイケース
370 名前:デフォルトの名無しさん [2008/01/24(木) 19:33:00 ] 32bit数どおしの足し算が範囲を超えたのかチェックするにはどうすればいいですか if無しで出来ますか
371 名前:デフォルトの名無しさん [2008/01/24(木) 19:37:22 ] a、bが1ビットならば a + b = (a and b, a xor b)_(2) ですが32bitはどうすればいいですか
372 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:41:31 ] 複数ビットの加算器 ttp://ja.wikipedia.org/wiki/%E5%8A%A0%E7%AE%97%E5%99%A8#.E8.A4.87.E6.95.B0.E3.83.93.E3.83.83.E3.83.88.E3.81.AE.E5.8A.A0.E7.AE.97.E5.99.A8
373 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:42:57 ] >>370 何も考えずに、一番簡単なやり方でやろうと思えば、64bit整数にキャストして足し算してしまうことだな。 後は(a+b) と aの大小を比較するとか。
374 名前:デフォルトの名無しさん [2008/01/24(木) 19:45:23 ] 比較とかキャストしないでマシンに手間がかからないでやる方法ないですか
375 名前:デフォルトの名無しさん [2008/01/24(木) 19:48:02 ] >>372 C言語は、1bit単位の変数ないし、加算器をソフトウェアで実装すると鈍いです 速い方法ないですか
376 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:50:15 ] a + b > INT_MAX ↓ a > INT_MAX - b
377 名前:デフォルトの名無しさん [2008/01/24(木) 19:51:39 ] 1bitみたいに桁上がりをandや+を使ってわかりませんか
378 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:53:06 ] 比較っつっても真偽値取得するだけなら setxx 命令使えるから遅くはならないと思うがね。
379 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:57:07 ] キャリーフラグとか? まぁ、どっちにしても比較はいるわなぁ……
380 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:58:15 ] a + bで、 aとbの符号が異なれば、オーバーフローすることはない。 同符号の場合、aやbの符号とa + bの符号が異なれば、オーバーフローしている。
381 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:59:57 ] インラインアセンブリ?
382 名前:370 [2008/01/24(木) 20:02:29 ] いい方法みつけたような気がします unsigned intだとします 桁上がりが起こるならどちらかの31bit目が1です 2^32からその数を引けばあといくつで桁上がりするかわかります そこで2の補数を求めてから2つの数を足してみて、31bit目が1なら負なので桁上がりしません
383 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:03:00 ] mov eax, a xor edx, edx add eax, b setc dl もうこれでええっしょ。
384 名前:370 [2008/01/24(木) 20:10:10 ] 間違えました でもいい線いってるきはします
385 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:10:12 ] OFビットを見るほうがいいんでね?
386 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:13:44 ] 久しぶりだからOFとか忘れてたお・・・
387 名前:370 [2008/01/24(木) 20:17:58 ] a+b; のあとにOFはどうすれば調べられるんですか
388 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:18:43 ] インラインアセンブリでごりごり
389 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:21:59 ] ((a >> 1) + (b >> 1) + (a & b & 1)) & 0x80000000 これでどうよ? シフト2回入っちゃうけど。
390 名前:370 [2008/01/24(木) 20:27:42 ] 良いですね 下位1bitの桁上がりを求めて、1bitシフトさせたものに加えれば桁上がりがわかりますね サンクス
391 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:29:19 ] 何か a >= (unsigned)-b の方が速い気がする。 ちゃんと実測してソースつきで報告よろ。
392 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:41:43 ] 符号ありなの無しなの?
393 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:44:21 ] なしっぽい流れ
394 名前:370 [2008/01/24(木) 20:58:30 ] なんか、if文の方が速いかも・・・BCC5.5の場合 #include <iostream> #include <time.h> using namespace std; #define N 1000000 #define rd() (rand()&255) #define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24) main(){ unsigned int *a=new unsigned int [N]; unsigned int *b=new unsigned int [N]; int n,cl,clsum[3],s=0; for(n=0;n<3;n++)clsum[n]=0; for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();} for(int k=0;k<200;k++){ cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1 )+(b[n]>>1 )+(a[n]&b[n]&1))>>31 ;clsum[1]+=clock()-cl; cl=clock();for(n=0;n<N;n++){unsigned int x=a[n],y=b[n];s+=((x>>1 )+(y>>1 )+(x&y&1))>>31 ;}clsum[2]+=clock()-cl; } cout<<"if文の速度 "<<clsum[0]<<endl; cout<<"if無しの速度1 "<<clsum[1]<<endl; cout<<"if無しの速度2 "<<clsum[2]<<endl; }
395 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:59:26 ] >>31 は遅いと思う。
396 名前:デフォルトの名無しさん [2008/01/24(木) 21:00:27 ] 最適化しないように文末にcout<<(s&1);を入れて下さい
397 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:00:39 ] if文じゃないだろif文じゃw 条件式だ。
398 名前:デフォルトの名無しさん [2008/01/24(木) 21:08:11 ] メモリアクセスに時間かかるようなのでパラメータ変更しました これだと微妙に論理演算のほうが速いかも #include <iostream> #include <time.h> using namespace std; #define N 10000 #define rd() (rand()&255) #define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24) main(){ unsigned int *a=new unsigned int [N]; unsigned int *b=new unsigned int [N]; int n,cl,clsum[3],s=0; for(n=0;n<3;n++)clsum[n]=0; for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();} for(int k=0;k<30000;k++){ cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1 )+(b[n]>>1 )+(a[n]&b[n]&1))>>31 ;clsum[1]+=clock()-cl; cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1 )+(y>>1 )+(x&y&1))>>31 ;}clsum[2]+=clock()-cl; } cout<<"if文の速度 "<<clsum[0]<<endl; cout<<"if無しの速度1 "<<clsum[1]<<endl; cout<<"if無しの速度2 "<<clsum[2]<<endl; cout<<(s&1); }
399 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:13:15 ] #include <stdio.h> #include <time.h> #define N 10000000 int main() { unsigned a, b=0; int k; int cl, clsum[2] = {0}; for(k=0;k<200;k++) { cl=clock(); for(a=0;a<N;a++)b+=(a>=(unsigned)-b); clsum[0]+=clock()-cl; cl=clock(); for(a=0;a<N;a++)b+=((a>>1 )+(b>>1 )+(a&b&1u))&0x80000000u; clsum[1]+=clock()-cl; } printf("条件式 : %d\n", clsum[0]); printf("ビット演算: %d\n", clsum[1]); printf("%u\n", b); return 0; } 条件式 : 1004 ビット演算: 1235 1
400 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:14:47 ] 最適化忘れてた 条件式 : 600 ビット演算: 677 MacOSX Core2Duo 2.16GHz gcc -O2
401 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:17:28 ] #include <stdio.h> #include <time.h> #define N 10000000 int main() { unsigned a, b=0; int k; int cl, clsum[3] = {0}; for(k=0;k<200;k++) { cl=clock(); for(a=0;a<N;a++)b+=(a>=(unsigned)-b); clsum[0]+=clock()-cl; cl=clock(); for(a=0;a<N;a++)b+=((a>>1 )+(b>>1 )+(a&b&1u))&0x80000000u; clsum[1]+=clock()-cl; cl=clock(); for(a=0;a<N;a++)b+=((a>>1 )+(b>>1 )+(a&b&1u))>>31 ; clsum[2]+=clock()-cl; } printf("条件式 : %d\n", clsum[0]); printf("ビット演算1: %d\n", clsum[1]); printf("ビット演算2: %d\n", clsum[2]); printf("%u\n", b); return 0; } 条件式 : 566 ビット演算1: 672 ビット演算2: 701 やっぱり条件式が一番速い。
402 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:20:42 ] std::exceptionを継承して使う場合 勝手にメンバとか付け足してもいいですか? たとえばHRESULTとか
403 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:20:57 ] ビット演算は健闘はしているけど、 いかんせん式が複雑すぎたな。
404 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:21:23 ] >>402 お好きにどうぞ
405 名前:デフォルトの名無しさん [2008/01/24(木) 21:21:51 ] 『最大50桁の自然数2つを、文字列として入力させて積を出す』 という問題が出たんですが。 先生とのメールのやりとり↓ 私「筆算の方法で行う」 先「積は和の繰り返しで表すこともできます」 私「最初の数値を次の数値分だけ足し算する (2×3 = 2+2+2)」 先「桁数が多い場合単純に繰り返すだけではだめです」 どうすればいいでしょうか(:_;) お願いします
406 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:22:47 ] コピペか?
407 名前:デフォルトの名無しさん [2008/01/24(木) 21:24:43 ] >>398 をVC++6でやると論理演算の方が速いよ 1248 1108 1425 となる BCC5.5では 1931 2878 2160
408 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:24:43 ] 最近どっかで見たな。
409 名前:407 [2008/01/24(木) 21:28:38 ] GCC(MinGW)では 829 1236 1841 同一スペックで>>398 を動かしたとき
410 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:37:26 ] >>398 ウチではこうなった。 1245 688 1302
411 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:38:58 ] >>398 ウチではこうなった。 if文の速度 100 if無しの速度1 111 if無しの速度2 107
412 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:40:17 ] あまりに早く終わるので N を 10 倍した if文の速度 896 if無しの速度1 1008 if無しの速度2 1061
413 名前:407 [2008/01/24(木) 21:47:10 ] 単純な計算と比べてもほんど無視できる程度しか変わらなかったよ・・・ #include <iostream> #include <time.h> using namespace std; #define N 10000 #define rd() (rand()&255) #define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24) main(){ unsigned int *a=new unsigned int [N]; unsigned int *b=new unsigned int [N]; int n,cl,clsum[4],s=0,t=0; for(n=0;n<4;n++)clsum[n]=0; for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();} for(int k=0;k<30000;k++){ cl=clock();for(n=0;n<N;n++)t|=a[n]&b[n]&1;clsum[3]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1 )+(b[n]>>1 )+(a[n]&b[n]&1))>>31 ;clsum[1]+=clock()-cl; cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1 )+(y>>1 )+(x&y&1))>>31 ;}clsum[2]+=clock()-cl; } cout<<"比較演算の速度 "<<clsum[0]<<endl; cout<<"論理演算の速度1 "<<clsum[1]<<endl; cout<<"論理演算の速度2 "<<clsum[2]<<endl; cout<<"単純な論理演算の速度 "<<clsum[3]<<endl; cout<<(s&t&1); }