1 名前:デフォルトの名無しさん [2009/12/15(火) 23:42:55 ] C言語の*入門者*向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 57 pc12.2ch.net/test/read.cgi/tech/1260020924/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 133代目 pc12.2ch.net/test/read.cgi/tech/1260532772/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
511 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 01:48:43 ] ソートのプログラムを組んだのですが、コンパイルしようとすると report5.c : 7 : error : syntax error before numeric constant というエラーが出ます どう修正したらいいのでしょう? ソースは以下です kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10302.c
512 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 01:57:49 ] >>511 > #define N 50 > > void sort(int x[], int N) #defineでシンボルNを定義しているので、2行後が void sort(int x[], int 50) と置換される。
513 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 02:27:34 ] >>512 深夜にありがとうございます! 仮引数になっていないのが原因だったってことでしょうか? Nを小文字のnに変えてもみたのですが、今度は report5.c : In function `sort': report5.c : 9 : error : 'x' redeclared as different kind of symbol report5.c : 7 : error : previous definition of 'x' was here と出てしまいました… ググってみるとxが衝突してるとのことですが、関数部とデータ入出力部の両方でxを使用しても問題ないはずですよね?
514 名前:511 mailto:sage [2009/12/24(木) 02:39:11 ] 連投すみません! 自己解決しました どうやら7行目と9行目の両方で変数xを定義していたのが問題だったようで… >>512 様ありがとうございました
515 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 12:57:05 ] 食ったー 満足じゃー
516 名前:デフォルトの名無しさん [2009/12/25(金) 10:34:07 ] 問題文: kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10305.txt linuxで、g++でemacsで書いて、k-termでコンパイル。 すみません。今日締切の問題で、スレ違いかもしれないんですが、どうかスレ主さま、作ってください。 お願いします。
517 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:38:26 ] 宿題スレがあるのにスレ違いと分かっててなんで質問するんだ?あほ? このスレの方が勢いがあるから?当然のようにageてるし
518 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:46:10 ] pc12.2ch.net/test/read.cgi/tech/1260532772/442 酷いマルチ>>516 のほうが後ってのが特に
519 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 10:54:38 ] 大抵宿題スレも見てるから、ここにマルチすると逆効果なんだけどね
520 名前:デフォルトの名無しさん [2009/12/25(金) 13:46:35 ] >>517 ,518,519 すみません。すれ違いでした。でも本当に急いでいて・・ みなさん、無駄にスレ使ってしまってすみませんでした。
521 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 13:50:14 ] >>520 逆効果なんだけど特別に許してあげるよ 感謝すればね
522 名前:デフォルトの名無しさん [2009/12/25(金) 14:11:41 ] >>521 はい。
523 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 14:16:28 ] 書き込めば書き込むほど、答えが返ってくる確率が下がるんだがw
524 名前:デフォルトの名無しさん [2009/12/25(金) 17:01:15 ] sprintfのところでエラーもでず勝手にPGが終了されるんだがなんだこれ?
525 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:03:53 ] ソース見せてみ
526 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:07:18 ] すみませんうつし先のバッファサイズが足りてなかったみたいデス しかし何も出ず終了とは
527 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:07:36 ] バッファ足りてないとか
528 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:08:36 ] バッファ足りてないとか
529 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:08:37 ] おぉリロード…
530 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 17:33:21 ] >>528-529 この間1秒
531 名前:デフォルトの名無しさん [2009/12/25(金) 18:31:07 ] PGが終了って、マ板ネタか?
532 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 18:32:10 ] マは常に終了してるからな^^
533 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 18:42:41 ] SEは終了してないとか
534 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:26:12 ] defineってどういうときにつかうん?
535 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:29:04 ] 気持ちよくなりたいときに使う
536 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:58:05 ] >>534 そりゃあプログラムを変更したい時に一か所一か所変更するのは面倒でしょ
537 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:06:15 ] defineに限らず構造体の定義などもまとめてヘッダファイルに記述する。 あとで変更したくなったときに、ロジック側を弄らなくて済むようにしておく。 あとはデバッグスイッチとかの条件コンパイル用かな。
538 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:32:54 ] 多用するとタコ殴り
539 名前:466 mailto:sage [2009/12/25(金) 22:38:24 ] MFCは、すごいマクロ使ってるね。あれはあれでありだとは思うが。
540 名前:デフォルトの名無しさん [2009/12/25(金) 23:19:37 ] >>539 頼むから冗談はよしてくれ
541 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:08:47 ] クリスマスにKFCでも食って気が上機嫌なんだろ
542 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:16:14 ] 気が上機嫌って何かおかしい気がしたけどよく考えたらそうでもない気がしないでもなかった
543 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:23:06 ] いや、おかしい。気が狂ってると書こうとして それはあんまりだと思って、上機嫌に変えた、つもりだったのです。
544 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:45:24 ] >>537 defineも構造体定義も、ヘッダファイルに書く場合は複数のソースファイルに公開する必要がある場合。 ひとつのソースファイルだけで使用するなら、そのソースファイルで定義するのが基本。
545 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 01:37:05 ] >>530 あたまわるいなぁ、とか言われなかったんだな
546 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 01:57:05 ] >>539 MFCのマクロは、Cプリプロセッサの究極をいってるな。 いっちゃってるけど。
547 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 08:11:39 ] 誰かMFCのマクロを見せてくれ
548 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 17:30:50 ] >>546 いやいや、究極と言えば、Boost.Preprocessorとかメタプログラミングの類。 こんな調子で、演算とかさせるんだぜ。頭がおかしいとしか思えない。 ttp://d.hatena.ne.jp/qnighy/20091107/1257587259 MFCなんてかわいいもんだ。
549 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:14:49 ] Boost.Preprocessor はもう天才的。 プリプロセッサメタプログラミングだぜ? 本当にやりやがった・・・的な衝撃が走る。
550 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:32:21 ] ×天才的 ○病的
551 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 18:34:03 ] メタプロ見てるとなんかもう新しい使いやすい言語でもつくりゃいいのにって思う
552 名前:デフォルトの名無しさん [2009/12/26(土) 19:00:45 ] 思うね
553 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:11:58 ] すいません。 feofというのは一体何の略なんでしょうか?
554 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:21:16 ] File EOF だと思うよ EOF は End Of File 細かいことはキニシナイ
555 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:21:43 ] >>553 eof = End Of File FILE *fp を取り扱う関数は、一般に fopen(), fclose(), fseek() のように頭に f がつくので、 f + End Of File = feof() 本当のところは知らないのですけど。
556 名前:553 mailto:sage [2009/12/26(土) 19:26:58 ] feof end of file 略 でググってみましたらそれっぽいものが見つかりました。 ファイルポインタがEOFに達しているかどうかを調べるんだそうです ttp://www.phpbook.jp/func/file/index3.html ありがとうございました
557 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 19:36:57 ] 略称の語源じゃなくて用途を調べてたのかよw
558 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 22:59:09 ] whileとSleepを使わずに 変数の値が変更されたときに自動で関数に飛ぶことって出来ないんですか? atexit()みたいな感じに
559 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:00:00 ] >>558 環境依存なのでOS等の情報が必要です
560 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:02:39 ] atexitは自動じゃないよ
561 名前:デフォルトの名無しさん [2009/12/26(土) 23:09:56 ] if ((flag & BIT1) && (flag & BIT2)) { これをもう少しスマートにやる方法ないですか?
562 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:16:03 ] コンパイラに最適化してもらいたい気分だ
563 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:22:17 ] すいません。 codepad.org/3p4Q55et 本に書いてある内容を要約するとこんな感じになるんですが、 ( !feof( stdin) ) というのは一体何を表しているのでしょうか。 stdinの中身がEOFにならなかったら〜という風に読めるのですが、 stdinとはcfPtrを指しているのでしょうか? stdinでググると標準入力だというようなことが出てくるのですが、 標準にそのままキーボードから打たれたものがEOFになったら〜という意味でいいのでしょうか?
564 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:28:05 ] >>563 戻り値 feof は,指定したストリーム上の最後の入力操作でファイル終了標識が 検出されると 0 以外の値を返し,ファイル終了標識に達しなければ 0 を返します。 とあるから、標準入力からWindowsならCTRL+Z、Unix系ならCtrl+Dが押される と !演算子によって条件が反転し真になる
565 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:28:18 ] >>561 ビットフィールドを使う
566 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:29:12 ] >>563 そうだよ。 ソースに書いてある通り、ctrl-zでEOFが入力される。
567 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:29:46 ] >>561 それぞれ1bitなら if ((flag & (BIT1|BIT2)) == (BIT1|BIT2))
568 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:34:42 ] >>564 >>566 標準にキーボードから入力していてEOFが検出されなかった場合〜という意味ですね。 ありがとうございました。
569 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:37:40 ] キーボードとはかぎらないしCtrl-Zともかぎらないがな
570 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:42:21 ] >>569 すいませんどういう意味でしょうか?
571 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:46:41 ] >>570 ファイルからリダイレクトとか。
572 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:46:47 ] >>570 パイプやリダイレクトとか
573 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:47:47 ] >>570 C言語にはストリームという概念がある。 ここに結び付けられるものは何でも良い。ファイルでも入出力デバイスでもC言語から見れば一緒。 ただ、一般的なPCではディスプレイ、キーボードが付いてるので"デフォルト(標準)"をそこにしてあるだけ。 標準入力がシリアル通信ポートだったり、標準出力がファイルだったりする環境もあるってこと。
574 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:53:40 ] >>558 あきらめてアクセサメソッドを介して変数を参照するようにしてはいかがでしょうか。
575 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:54:09 ] DOSやWindowsならCtrl+ZだがUNIX系ならCtrl+Dだったかな
576 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:58:10 ] >>571->>573 >>575 入力できればなんでもいいってことですか、ありがとうございました。
577 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 00:00:00 ] 何でもいいわけじゃない 何が割り当てられてるかだ
578 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 15:46:46 ] >>567 その前提条件って必要なの?
579 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:11:57 ] >>567 &&がなくなるから、速くはなりそうな気もするけど、 最適化でチャラになるかもしれないし、読みやすさなら 元のコードのほうがいいと思う。
580 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:48:47 ] main(){ char hello[] = {'h', 'e','l','l','o'}; puts(hello); } 結果がおかしくなります
581 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:50:48 ] char hello[] = {'h', 'e','l','l','o'}; じゃなくて char hello[] = {'h', 'e','l','l','o','\0'};
582 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:58:22 ] >>581 ありがとう、期待する動作になりました。
583 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:58:27 ] もしくは char hello[] = "hello";
584 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 00:10:13 ] >>578 例えばBIT1が ((1<<0)|(1<<1)) だった場合 flagの下位2bitがそれぞれ 01,10,11 のどれであっても (flag & BIT1) は非0になるが (flag & BIT1) == BIT1 となるのは、11の場合のみ。 >>579 普通は"(BIT1|BIT2)"をそのまま使うなんてやり方しないよ。 const mask = BIT1 | BIT2; // constじゃなくてdefineだろうがenumだろうが構わんが。 if ((flag & mask) == mask) これを可読性が悪いとか言うならどうかしてる。 元の >if ((flag & BIT1) && (flag & BIT2)) { よりわかりやすいだろうに。
585 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 01:03:34 ] どっちも特に難解な記述だとは思わないけどさ (1) if ((flag & mask) == mask) (2) if ((flag & BIT1) && (flag & BIT2)) どうみても(2)の方が分かりやすい
586 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 03:31:36 ] うーん、どうだろう 個人的には識別子が1個少ない分、(1)の方が読みやすい
587 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 03:40:46 ] ビット演算には三項演算子を使うべきだと思う
588 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 04:30:39 ] >>585 どうみても(2)の方が分かりやすいよね! (1) auto hoge_mask=BIT1|BIT2|BIT3|BIT4|BIT5|BIT6|BIT7|BIT8|BIT9; if((flag&hoge_mask)==hoge_mask) (2) if((flag&BIT1) && (flag&BIT2) && (flag&BIT3) && (flag&BIT4) && (flag&BIT5) && (flag&BIT6) && (flag&BIT7) && (flag&BIT8) && (flag&BIT9))
589 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 05:52:52 ] mask)==mask 部分が冗長に見えるから違和感感じるんDA !^(flag|^mask) // こうだな
590 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 06:29:05 ] >>589 ドモルガン使ってこう書いた方が見た目は奇麗。 !(~flag&mask) まぁ~maskは定数になるだろうから>>589 と計算量は殆ど同じだろうけど
591 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:39:41 ] ビットビットうるせーよ
592 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:54:10 ] >>591 禿同 可読性云々以前にコメントつければすむ問題
593 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:02:08 ] 今の時代、ビットフラグなんて使わないでフラグごとに変数使うんじゃねーの?
594 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:38:36 ] >>593 時代は関係ないし、それいうならC使う事自体がどうなんだって話に。 移植性考えないならビットフィールドでもいいかも知れん。
595 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:14:55 ] >>594 ただのフラグならビットフィールドでも移植性は関係無いだろ。
596 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:51:33 ] 移植性考えるなら、ビットフィールドのほうがいい。
597 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:58:56 ] やりたいことが フラグAが立つ、かつ、フラグBが立つ なのか ビットAとビットBの両方がセットされてる なのかで使いわけろよ フラグの実装がビットだからビット演算使うのは短絡的
598 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 13:00:28 ] 移植性考えるならドトネトのほうがいい
599 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 13:56:28 ] 上位ビット/下位ビットのどっちから割り振られるかが処理系次第な ビットフィールド使うくらいなら、_Bool 使えばいいのに。
600 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:07:42 ] ビットフィールド云々は置いといて、 ビット演算についてだけ言えば if (value & 0x0001) 奇数かどうか、を見るこれだけでも ビット演算はコメントを必ず入れるべきと思う。
601 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:17 ] >>599 > 上位ビット/下位ビットのどっちから割り振られるかが処理系次第な どんなもん、どっちでもいいだろ。
602 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:21 ] 思わない
603 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:11:28 ] ビットビットうるせーよ
604 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:12:30 ] 思う気がする
605 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:22:14 ] コメントよりマクロの方がいいだろ if(IS_ODD(value))
606 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 14:23:20 ] ♪ひ〜とびと〜のビットビット〜
607 名前:デフォルトの名無しさん [2009/12/28(月) 14:40:05 ] ビット命
608 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 15:02:13 ] >>602 どっちでもいいだろ。 問題になるのはハードにマップされてるとかそういう時だけで、フラグで使ってるだけならメモリの配置は関係ない。
609 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:40:37 ] どっちでもいいね
610 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:06:00 ] いいんじゃないかな。どっちでも
611 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:20:29 ] 1bit毎のビットフィールドならエンディアンの影響は受けないでしょ。
612 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:30:26 ] ビットビットうるせーよ
613 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 19:37:07 ] Cのスレだから仕方ないだろjk
614 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 19:57:03 ] ある整数の最上位の1であるビットが何桁目かを計算したいんだけど一発で計算剃る方法ってある? ビット数分だけ判定繰り返すしかないかな
615 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:15:24 ] あっぱれビット天国〜
616 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:05:18 ] >>614 どんな方法があるのか教えてくれたら教えるお(´・ω・`)クフゥ
617 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:10:45 ] 一発じゃないけど 最上位ビットの位置が記された256個のテーブルを使う
618 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:13:18 ] log をとるとかw
619 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:27:10 ] 人間の性能を表現するには何ビットあればいいですか?
620 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:33:57 ] 冬休みか
621 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:52:03 ] どうしたの?君たち 警戒心起たせちゃって
622 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:00:34 ] >>614 他人に作らせるのがもっとも賢い方法
623 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:13:11 ] >>614 32bit なら 5回 下の関数みたいなのをマクロで作ればおk int leftbit(unsigned long x) { int bit=0; if(x&0xffff0000) bit+=16,x>>=16; if(x&0xff00) bit+=8,x>>=8; if(x&0xf0) bit+=4,x>>=4; if(x&0xc) bit+=2,x>>=2; if(x&0x2) bit+=1,x>>=1; return bit; }
624 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 23:27:01 ] みんなレスd >>623 それいただきます!
625 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:11:44 ] みんなが笑ってる お日様も笑ってる るーるるるるっるー 今日もいいテンキー だからどうしたというのですか。 っていうか何故テンキーが重要なのですか。
626 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:15:03 ] ループしたらええやん for(bit=0; result != 1; bit << 1){ result = (BITCHECK & bit); }
627 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:16:01 ] 最上位か ほな逆にMSBから
628 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:32:48 ] >>626 え?
629 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:36:01 ] result = (int)ceil(log((double)x) / log(2.0)); 実数演算だけど、logで計算したほうが、条件分岐が入るより速いんじゃないか?
630 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:15:06 ] こういうときに、キャリーフラグの便利さを思い出す。
631 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:17:50 ] 実数は誤差が入るからダメ
632 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:18:35 ] 誰か超高速なreplace関数作ってけろ
633 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:33:09 ] >>631 >>629 は誤差とは関係ないだろ。
634 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:46:19 ] >>633 すまん。俺が間違ってたorz
635 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:28:38 ] >>633 なんで誤差とは関係ないの? 浮動小数点演算である以上、誤差はあるはず 誤差が1未満だから ceil()で消えるってこと? >>629 ceil じゃなくて floor じゃないの?
636 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 03:11:06 ] >>635 そう。 整数部にまで及ぶような誤差がでないと結果に誤差が反映しない。 はるか下のほうの桁にしか、誤差はでないと思われ。 よくみたら、切り上げだと桁が繰り上がるところで正しい結果がでないね。 +1してfloor()だ。
637 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:37:44 ] #define mx(a,x,m,b) ((x)&m>(x)~m?(x)&=m,(a)|b:(x)&=~m,(a)) mx(mx(mx(mx(mx(a,x,0xaaaaaaaa,1),x,0xcccccccc,2),x,0xf0f0f0f0,4),x,0xff00ff00,8),x,0xffff0000,16);
638 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:40:37 ] >>637 あ、だめだx変わんね!
639 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 08:49:40 ] >629 浮動小数点数使うんなら frexp(x, &result) でいいじゃん。
640 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:21:01 ] >>623 >>629 >>639 で簡単にベンチとってみた。 ビットが立っていない場合が 0 になるように一部変更してる。 codepad.org/VT7XBJAP Core2Duo T7600(2.33GHz) / RAM 3GB gcc version 4.3.4 20090804 (release) 1 (GCC) 最適化オプション指定なしで 50,000,000 要素に対して 10 回実行した平均値だと >>623 1.4564秒 >>629 6.2842秒 >>639 1.5501秒 -O2 指定で >>623 0.6673秒 >>629 6.0827秒 >>639 1.2921秒
641 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:57:31 ] logって中の人がフーリエ展開とかしてるからおそいのかね?
642 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:09:46 ] >>637 を推考し直してみました #define mx(b,m,x,a) (x&m>x&~m)?(a)|b,(a)) =mx(1,0x55555555,x,mx(2,0xaaaaaaaa,x,mx(4,0xf0f0f0f0,x,mx(8,0xff00ff00,x,mx(16,0xffff0000,x,0)))));
643 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:15:41 ] expは兎も角logは余り使われないから金がかかっておらず相対的に 「計算」が早くは無い。CPUレベルのサポートで 並列化を促進すれば何倍も速くなる筈だが、コストパフォーマンス が低くやる価値が少ないと判断されてるだけ。
644 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:35:42 ] さすがに6秒も差が出来ると主任も「ウーム」と改善を要求してくるレベル
645 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:39:10 ] >>644 「試行回数を減らせば早くなりますよ!」
646 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:40:56 ] >>644 回数が少なければ「わかりやすい」コードがお勧め
647 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:45:41 ] え?一番早い方法を模索してるんじゃないの?
648 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:49:19 ] ウチの上司は元組み込み屋なので 「呼んだ関数が処理してる時間は極力短く」 「呼んだ関数だけじゃなく処理時間そのものも極力短く」 「デッドラインを設ける」 とまあ常に組み込み状態 すべての処理コードが割り込みの考え方で動いてる (他の誰も入って来れない時間を短く=CPU占有の時間を短く)
649 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:51:04 ] >>641 底の変換してからFYL2X使ってるみたい 二回計算しないといけないから遅いのかもね
650 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:52:53 ] つーかあれか logは底がネイピア数だからそのままFYL2Xでいいのか その周囲の面倒臭いコードはDOMAIN ERRORとかチェックしてるだけか そうなるとlog10ならもっと遅いだろうね
651 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 12:00:37 ] >>648 昔組み込みやってた 小さいものはパズルみたいで楽しかったけど 大きなものだと死にそうになるんだよな・・・・
652 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 13:09:09 ] >>651 なるね