- 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
- 284 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 03:00:25 ]
- >>282
比較関数で比較対象を出力してみて思っただけなので、 もしかしたら間違ってる可能性もあります。 一応ソースと出力結果貼っておきますね。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5841.txt ------ソート前------ 4 5 1 2 3 >要素数:5 -----ソート開始----- 1回目: 5と 4を比較 2回目: 1と 5を比較 3回目: 2と 5を比較 4回目: 3と 5を比較 5回目: 3と 4を比較 6回目: 1と 4を比較 7回目: 2と 4を比較 8回目: 3と 2を比較 9回目: 1と 3を比較 10回目: 1と 2を比較
- 285 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 03:00:53 ]
- >>284
ああ、なるほど。
- 286 名前:デフォルトの名無しさん [2008/01/21(月) 15:28:11 ]
- C言語で質問なのです。
下のプログラムは動作確認済みなのですが、なぜ動作するかがわかりません。 iでfor文を考えているのに、for{}の中にiがなくても、動作するのはどうしてなんでしょうか? #include<stdio.h> int main(void){ double a[15]={-256.0,-128.0,-8.0,-2.0,-1.3,-1.0,-0.5,0.0,1.0,1.3,2.0,8.0,128.0,256.0}; double *p; p=a; for(i=0;i<15;i++){ printf("%f\t%p\n",*p,p); ←例えばこの部分がprintf("%f\t%p\n",a[i],p);とかなら納得なのですが… p++; } return(0); }
- 287 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 15:36:25 ]
- >>286
ポインタ習ってないの?w
- 288 名前:デフォルトの名無しさん [2008/01/21(月) 15:46:18 ]
- ポインタについてはまだ理解力が足りないと思っています。
ただ、printf("%f\t%p\n",*p,p);にするなら、forの()の中身をpのみで表さないとなんか気持ち悪い気がして… 今までやってきたfor文は()の中の変数が{}の中で必ず使われてきたので…
- 289 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 15:50:57 ]
- 確かにあんまり行儀のいいプログラムじゃないなぁ。
私ならこう書く。 #include<stdio.h> int main(void) { double a[]={-256.0,-128.0,-8.0,-2.0,-1.3,-1.0,-0.5,0.0,1.0,1.3,2.0,8.0,128.0,256.0}; for (unsigned i = 0; i < sizeof(a) / sizeof(* a); ++i) { printf("%g\n", a[i]); } return 0; } ポインタを使うならこうなるかな。 for (double * p = a; p - a < sizeof(a) / sizeof(* a); ++p) { printf("%g\n", * p); } return 0; } いずれにしろ、定数を生のまま書くのはやめた方がいい。
- 290 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 15:51:24 ]
- >>286
>printf("%f\t%p\n",a[i],p)とかなら・・・ それを言うなら、printf("%f\t%p\n",a[i],&a[i]); だろ? 最後のpがokなら、*pもokだろうに。
- 291 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 15:51:39 ]
- >>288
p=a; //pがaの先頭(-256)を指す printf("%f\n", *p); //pが現在指してる値(-256)を表示する p++; //pが次の要素(0)を指す printf("%f\n", *p); //pが現在指してる値(0)を表示する p++; //pが次の要素(-128)を指す printf("%f\n", *p); //pが現在指してる値(-128)を表示する 以下繰り返し iを使ってるのは、単に繰り返し回数を数えるため
- 292 名前:デフォルトの名無しさん [2008/01/21(月) 15:56:46 ]
- >>289-291
みなさんわかりやすい説明をありがとうございます。 なんとか理解できそうです。
- 293 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 18:26:49 ]
- >>288
繰り返し「回数」を明示するためにfor使ってるんじゃね そのプログラムだとp+iとかp[i]とかでもいいが ループ回数だけが重要で、何回目のループかはどうでもいいこともたまにある
- 294 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:41:09 ]
- ループ変数にunsignedを使っちゃう奴を久しぶりに見た
- 295 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:42:30 ]
- >>294
なんかまずいんですか?
- 296 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:44:46 ]
- どうみてもわざと
- 297 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:46:48 ]
- ここで聞いていいか分からないのですが、スレ違いならスレ教えてください。
目的はC++を使えるようになることです。 C++の前にC言語勉強した方がいいということで、(どっかのサイトに書いてあった) 今はC言語を勉強中ですが、 一通り勉強したらC++に移ってもいいでしょうか? それとも、C言語をしっかりやってからの方がいいですか?
- 298 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:55:42 ]
- >>297
俺は両者を混同しなければいつ移ったって構わないと思う。 まぁせっかくCやってるんだからポインタあたりまでは勉強したほうがいいかもね。
- 299 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:12:43 ]
- >>298
ありがとうございます。 ざっと一通り勉強してから移ります。
- 300 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:13:38 ]
- 自分の勉強の方針くらい自分で決めろよ
学習を進めていけば、次に何をしたらいいかくらい 自分で判断できるようになる。 C++の勉強を始めたが最期、Cの勉強には一生戻れない というわけでもあるまいし。
- 301 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:28:36 ]
- 逆に考えるんだ。
次にやるべきことを判断できるようになるまで 真面目に勉強する気が最初からないと考えるんだ。
- 302 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:47:04 ]
- というようなキチガイ的な返事しか出来ないのがプログラマw
個人的にはいきなりC++でも全然問題ないと思う。
- 303 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:57:41 ]
- >>295
> なんかまずいんですか? ・ふつーint ・差をとったりして負の数が出てくる計算で気分的によろしくない
- 304 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:31:29 ]
- >for (unsigned i = 0; i < sizeof(a) / sizeof(* a); ++i) {
forの初期化のトコで宣言出来るのってC99だっけ?
- 305 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:34:46 ]
- C++も
- 306 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:37:47 ]
- size_t型が符号なし整数として定義されている環境だと、iがsignedの場合
i < sizeof(a) / sizeof(* a); の部分で「signedとunsigned比較すんなボケ」という警告が出るから unsignedにしたんだろう。 だがこれだと、size_t型が符号あり整数として定義されている環境では 逆に警告が出る。 これが嫌な人は(sizeof(a) / sizeof(* a))の方をcastしたりするんだろうけど、 signedなsize_t型なんて聞いたことないからぶっちゃけどーでもいい。
- 307 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:52:47 ]
- 根本的に違うんじゃね?
for文回すのにunsignedがいけないという理由は for (unsigned i = 0; i > 0; i--) { ... } というような回し方をしてたら、unsignedだから結局、 0未満は無いで、知らずに無限ループにハマってしまうからやめろ とか、そんな理由の奴は聞いた事がある
- 308 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:04:27 ]
- そもそも、回数が固定なループを書くときに
継続条件に < を使うのがおかしい。!=を使え。
- 309 名前:デフォルトの名無しさん [2008/01/21(月) 23:15:54 ]
- signed/unsigned関係ないし・・・
iteratorならよく見るが、ふつうは不等号じゃね?
- 310 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:16:23 ]
- >>306
>だがこれだと、size_t型が符号あり整数として定義されている環境では そんな環境ありえねー。 >>307 そのループ1回も実行されないぞ。 まずいのは、例えば i を 9, 8, ... 1, 0 としてループしたい時に for(int i = 9; i >= 0; i--){ ... } って書いた場合、int を unsigned int にすると、>>307 の言うようにはまる。 でも、最近のコンパイラなら i >= 0 が偽にならないとかの警告が出るものも多いよ。 >>308 ネタだろうが、それはない。
- 311 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:20:52 ]
- >>310はイテレータを使ったことがないとみた
- 312 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:26:40 ]
- 俺もたまに使ってしまう>unsigned
vectorなんかを添え字で単純に回したいとき。 くせというかなんというかw
- 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 ]
- 間違えました でもいい線いってるきはします
|

|