[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/29 13:41 / Filesize : 252 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.47【環境依存OK】



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);
}






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<252KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef