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


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

<集大成>アルゴリズム大辞典



1 名前:デフォルトの名無しさん mailto:sage [04/06/03 23:18]
どこにもない強固なスレにしたい

49 名前:デフォルトの名無しさん mailto:sage [04/10/01 12:08:21]
>>48
教育用?

クレオソートってどんなときに使うの?

50 名前:デフォルトの名無しさん mailto:sage [04/10/01 12:58:46]
>>49
> クレオソートってどんなときに使うの?
下痢止めの薬を作るとき、かな。


51 名前:デフォルトの名無しさん mailto:sage [04/11/08 22:59:22]
>>48
使うときほぼないけど、学習用によく使われるみたい。

52 名前:1 mailto:sage [04/11/08 23:05:17]
おいっ!おまいら!大変です!
バルブソートでググったら、なんとこのスレが2番目にあったよ




53 名前:デフォルトの名無しさん mailto:sage [04/11/09 17:05:25]
#include <algorithm>

54 名前:デフォルトの名無しさん [05/01/30 17:56:48 ]
age

55 名前:デフォルトの名無しさん [05/03/08 22:07:30 ]
自前で簡単なオーディオミキサを作りたいのですが、どんなアルゴリズムにすれば良いのでしょうか。

サンプリングレートは8000。
チャンネルは1つ(モノラル)。
ビット数は16。
音声データは160バイト(20[ms])に細かく切られている。

これが複数の音源からやって来ます。
複数の音源の同期は取りません。取り敢えずタイミングは無視してミックスします。
同期よりも遅延の方を問題に思っていますので。

こんな感じで良いのでしょうか?
for( int i = 0; i != 160; i++ )
  if( buffer_1[i] < buffer_2[i] )
    buffer_o[i] = buffer_2;
  else
    buffer_o[i] = buffer_1;

その後でDirectXでストリーミング再生します。

56 名前:55: 訂正 [05/03/08 22:08:24 ]
for( int i = 0; i != 160; i++ )
  if( buffer_1[i] < buffer_2[i] )
    buffer_o[i] = buffer_2[i];
  else
    buffer_o[i] = buffer_1[i];

57 名前:デフォルトの名無しさん mailto:sage [05/03/09 00:07:52 ]
アルゴリズムと言うよりも、スレッドとかノンブロッキングとかデバイスの扱いでは?
DirectXとかよくわからんけど



58 名前:55 [05/03/09 00:37:21 ]
すみません。要点がはっきりしてませんでした。

ポイントは、音源Aと音源Bのデータをミックスする時にどの様にすべきかです。

例えば以下の様な事が単純に思い付きます。

1.AとBの平均を取る。
out=(A+B)/2

2.AとBを単純に足す。最大値を越えた場合(65535<(A+B))は最大値(==65535)とする。
out=max(65535, A+B)

3.AとBを比較して、大きい方の値とする。(>>56の内容に等しい)
out=max(A, B)

良く分かりませんが、他にもっとインテリジェンスなやり方が有ったら教えて頂きたいなあと思った次第です。

59 名前:デフォルトの名無しさん mailto:sage [05/03/09 00:51:31 ]
out=a*A+b*Bでいいんじゃないの?
(a, bは入力レベル。通常は1でいいと思うけど、音割れするようだったら絞ればいい)

60 名前:55 [05/03/09 01:03:55 ]
ありがとうございました。

実はRTPもどきを使って3人以上で会話するってプログラムを作ってました。
会話の場合は、1人が喋っていても他の2人は無音の場合が多く、>>59のやり
方で問題無いと思います。

61 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 15:57:46 ]
ええとね。
サウンドプログラミング2
pc8.2ch.net/test/read.cgi/tech/1091054082/
で聞いてくれれば良かったかもな。

問題は、複数の音源の場合、サンプリングレートが微妙に違う点にあると思うよ。
まあ、無音の間に適当に入れたり出したりして誤魔化すんだろうけど

62 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 16:01:51 ]
で、そいう場合は
out = r*(A+B);
if( abs(out)>=0x7fFF) r = r*0.95 else r=min(1.0, r+1/8000);

こんな感じで、合成音がクリッピングしたら、出力を絞るような方式がいいと思うよ。

63 名前:デフォルトの名無しさん [2005/04/30(土) 22:21:53 ]
よく、テキストの機能とかにある無限アンドゥってどんなアルゴリズムなんでしょうか?教えてください

64 名前:デフォルトの名無しさん mailto:sage [2005/04/30(土) 22:25:14 ]
ユーザーが入力した内容のログを全部取っておくだけの事。

65 名前:デフォルトの名無しさん mailto:sage [2005/04/30(土) 22:37:29 ]
安藤がきたら、挿入なら削除というようにログの逆を辿る。
Redoはログからもう一度ユーザーの内容を再現していく。
うまく動くと面白いし、何かを編集するアプリなら必須機能の1つ。
がんばって作ってくれ。

66 名前:デフォルトの名無しさん mailto:sage [2005/04/30(土) 22:56:45 ]
クリックやキー入力のイベントが起こったとき
現在の状態を全部ファイルにバックアップする


67 名前:63 mailto:sage [2005/04/30(土) 23:00:56 ]
とりあえず処理の検討はつきました。どうもです



68 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 12:54:00 ]
クヌース先生のアルゴリズムのバイブルを買うと馬鹿にされますか?

69 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 13:11:04 ]
>>64,66

70 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 13:15:15 ]
保管するだけでも場所とって大変だから、
図書館から借りてくることをオススメする

71 名前:デフォルトの名無しさん [2005/05/02(月) 01:03:58 ]
>>68
されません

72 名前:デフォルトの名無しさん [2005/05/02(月) 19:34:01 ]
マインスイーパーで裏返したセルが0だったときのアルゴリズムおせーて

73 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 19:47:56 ]
>>72
m_buttonHogeを用意しといて
if(stCell == 0)
  m_buttonHoge(FALSE);
else
  m_buttonHoge(TRUE);

ってな感じでは?

74 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 19:49:54 ]
プ(AA略

75 名前:デフォルトの名無しさん [2005/05/02(月) 19:53:44 ]
マインスイーパーって裏返したのが0だったら周りの0も連鎖して裏返るんだよね
そこが難しいんです

76 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 19:56:24 ]
>>73
m_buttonHogeを用意しといて
if(stCell[x][y] == 0)
  m_buttonHoge.ShowWindow(FALSE);
else
  m_buttonHoge.ShowWindow(TRUE);
のまちがいだろ

77 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 20:03:22 ]
BOOL reverse(int x, int y)
{
  if(stCell[x-1][y-1]
    m_buttonHoge[x-1][y-1].ShowWindow(FALSE);
  else
    m_buttonHoge[x-1][y-1].ShowWindow(TURE);
  if(stCell[x][y-1]
    m_buttonHoge[x][y-1].ShowWindow(FALSE);
  else
    m_buttonHoge[x][y-1].ShowWindow(TURE);

  if(stCell[x][y-1]
    m_buttonHoge[x][y-1].ShowWindow(FALSE);
  else
    m_buttonHoge[x][y-1].ShowWindow(TURE);

  if(stCell[x+1][y-1]
    m_buttonHoge[x+1][y-1].ShowWindow(FALSE);
  else
    m_buttonHoge[x+1][y-1].ShowWindow(TURE);

以下略
  return TRUE;
}



78 名前:デフォルトの名無しさん [2005/05/02(月) 20:09:35 ]
裏返す

0だ

周りを探す

また0だ

周りを探す

・・・・・・元の場所わかんねぇ('A`)

79 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 20:18:10 ]
>>77
reverse(0, 0);
は大丈夫なのかな?

80 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 20:25:38 ]
77ですが
>>79
TRY CATCHでくくって例外は処理しないようにすれば?

81 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 20:32:24 ]
>>80
TUREって何よ?

82 名前:デフォルトの名無しさん [2005/05/02(月) 20:33:16 ]
>>81
つまんねーレスすんなよ。

83 名前:デフォルトの名無しさん [2005/05/02(月) 20:41:59 ]
http://から始まる文字列があった場合に<a href="hoge">hoge</a>に痴漢するアルゴリズム教えてください。
アドレスと文字列の区別は・・・どうするのが一般的?
2バイト文字にぶち当たったらとかかな。

84 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 20:44:22 ]
>>81
"つれ"た、ってことなんじゃ?

85 名前:デフォルトの名無しさん [2005/05/02(月) 22:39:55 ]
>>83
sedでよければw

86 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 22:47:57 ]
>>・・・・・・元の場所わかんねぇ('A`) 
そこで再帰関数ですよ。

こんな感じだったけなぁー。
なんせ3年前位に作ったやつだから忘れちゃってる。
間違ってる可能性大
int hoge(int x,int y){
    int b=0;
    if(table[x][y] == BOME){
         return BOME;
     }
     for(int i=0;i<9;i++){
       if(table[pos[i].x+x][pos[i].y+y]==BOME){
          b++;
        }
      }
      if(b==0){
         for(int i=0;i<9;i++){
           hoge(pos[i].x+x,pos[i].y+y)
         }
      }
      return 0;
}

87 名前:デフォルトの名無しさん [2005/05/04(水) 21:48:03 ]
コムソートってどんなソートなのでしょうか?
ググってもでてきません。よろしくお願いします。



88 名前:デフォルトの名無しさん mailto:sage [2005/05/04(水) 21:50:41 ]
>>87
検索が下手。

www.google.co.jp/search?hl=ja&q=%E8%99%9A%E7%84%A1%E5%83%A7%E3%81%A8&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja


89 名前:デフォルトの名無しさん mailto:sage [2005/05/04(水) 23:06:09 ]
>>87
ttp://www.ffortune.net/comp/develop/sort/gaikan.htm

90 名前:デフォルトの名無しさん [2005/05/04(水) 23:52:38 ]
>>89
ありがとうございます。
でもできたら参考文献とかあったらうれしいな、なんて

91 名前:デフォルトの名無しさん mailto:sage [2005/05/05(木) 00:02:29 ]
参考文献などない!

92 名前:デフォルトの名無しさん mailto:sage [2005/05/05(木) 00:12:42 ]
コムソートの利点はリソース消費しないってとこだね。

Comb sort algorithm
www.google.co.jp/search?hl=ja&q=Comb+sort+algorithm&lr=

93 名前:デフォルトの名無しさん mailto:sage [2005/05/05(木) 04:30:23 ]
学生の宿題を手伝うスレw

94 名前:デフォルトの名無しさん [2005/05/07(土) 20:38:46 ]
数値を格納した二つの配列があり、
その二つの配列に共通する数値のみを選び出す効率的なアルゴリズムって何かありますか?

95 名前:デフォルトの名無しさん mailto:age [2005/05/07(土) 21:17:43 ]
>二つの配列に共通する数値
a.格納位置も一緒
b.格納位置が違っていてもOK

b.だとすると数値がダブっている場合どう考えるんだ?

96 名前:デフォルトの名無しさん mailto:sage [2005/05/08(日) 05:15:32 ]
ハッシュテーブルかな
衝突がなければO(1)


97 名前:デフォルトの名無しさん mailto:sage [2005/05/08(日) 07:11:44 ]
>>96 でいいとおもうけど、別案

片方で分布数えソートの前段階(分布だけ調べる)まで行い、
もう片方をスキャンすれば、重複する値がわかる



98 名前:デフォルトの名無しさん mailto:sage [2005/05/08(日) 12:50:16 ]
>>96
配列に格納されている数値が何かのハッシュだったら、どうするの?

99 名前:デフォルトの名無しさん mailto:sage [2005/05/08(日) 15:42:48 ]
>>98
内容がなんであっても、ハッシュで問題ないと思うがどうだろう?

100 名前:デフォルトの名無しさん mailto:sage [2005/05/13(金) 13:47:35 ]
ユーザーがマウスを用いてフリーハンドで引いた線を、
複数のベジェ曲線へと変換するアルゴリズムって何かありますか?

www.simdesign.nl/bezier.html
上記のような有料のライブラリは見つかったのですが・・・。


101 名前:デフォルトの名無しさん mailto:sage [2005/05/13(金) 15:56:51 ]
>>100
そのサンプリング点を端点に、
端点の微分が一致するという条件で解いたらどう?

102 名前:デフォルトの名無しさん mailto:sage [2005/05/13(金) 16:00:58 ]
>>100
ttp://www.tensyo.com/urame/prog/linealgo.htm
ここの 折れ線から滑らかな曲線に という所に、点を与えながら処理する方法が

103 名前:デフォルトの名無しさん [2005/05/15(日) 19:46:06 ]
コンドーム

104 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 09:09:03 ]
www.tensyo.com/urame/prog/linealgo.htm
ここの 折れ線から滑らかな曲線に 以外に
複数のベジェ曲線へと変換するアルゴリズムって何かありますか?

105 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 23:45:00 ]
手書き

106 名前:デフォルトの名無しさん mailto:sage [2005/05/18(水) 07:29:50 ]
>>104
それ以外にと聞かれるならば
1、3次スプライン補間法 で解いてからベジェに変換する
2、混合スプライン、ベーススプライン等で解いてからベジェに変換する

という方法が考えられます

107 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 09:14:39 ]
ベジェ曲線を描くときにマウスが拾ったすべての点において
ベジェ曲線を描くのではなく、点を間引いて描きたいのですが、
どのように点を間引いたらいいかがわかりません。
何か良いアイデアはありませんか?



108 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 23:32:01 ]
3点支持

109 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 08:38:54 ]
どのように間引くかと聞かれても、 どうしたいのか判らないので困ってしまう

たとえば、直線的に引いた通過点を間引きたいならそうすればいい
 前2点の延長線からの誤差が一定いないなら、その前の点を除くとかさ



110 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 19:06:48 ]
XMLデータの検索プログラムを作ろうと思っているのですが、
単純な検索はBtree*を用いて作成しましたが、XMLのある部分が合致するような
検索をする場合どのような手法があるのでしょうか?

111 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 19:44:10 ]
基本的には文字列の検索と同じ方法になるだろうけど、それでは満足出来ないんだろうね。

となると、その部分をB木の検索キーに入れておくしかないかもな

112 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 20:40:13 ]
そっかぁBtreeかRTreeで何とかするしかないようだな。どもです。
後差分を取る方法って今主流な方法でどのような方法があるのでしょうか?
XMLデータの差分を取ってみたいと思うのですがそっち方面は何もわかりません。

113 名前:デフォルトの名無しさん [2005/06/15(水) 08:29:58 ]
立っているビットの位置を調べるアルゴリズムで以下の物より高速な物はあるでしょうか?
int i=1;調べるビット列 bits;
while(i<sizeof(調べるビット列)*8+1){
if(bits%2){
cout << i << ",";
}
bits >> 1;
i++;
}
cout << endl;

114 名前:デフォルトの名無しさん mailto:sage [2005/06/15(水) 11:51:50 ]
>>113
while(bits!=0)
{
  if(bits&1!=0)
  {
    cout << i << ",";
  }
  i++;
  bits=bits>>1;
}
cout << endl;
上位がゼロになればそれ以上調べなくてもよい。
ビットが1つしか立ってないなら、二分探索が使えるが。

115 名前:デフォルトの名無しさん mailto:sage [2005/06/15(水) 15:49:29 ]
MSBだけ知りたい場合でもバイナリ検索が使えるよ

116 名前:デフォルトの名無しさん mailto:sage [2005/06/15(水) 22:55:01 ]
こういう小手先テクはトリッキースレにあった気がする

117 名前:デフォルトの名無しさん mailto:sage [2005/06/16(木) 07:05:10 ]
テーブル検索という方法もあるね。



118 名前:デフォルトの名無しさん mailto:sage [2005/06/16(木) 09:34:53 ]
>>110 XMLを一旦Prologの項に変換してassertして、
Prologの述語呼び出しや、述語定義の参照述語を使って
部分構造の検索をする。

119 名前:デフォルトの名無しさん mailto:sage [2005/06/24(金) 07:20:01 ]
m/123 * 100/101 < x1 < m/123 * 100/99
m/456 * 100/101 < x2 < m/456 * 100/99
m/789 * 100/101 < x3 < m/789 * 100/99

x1, x2, x3 に正の整数が含まれるm > 0の条件は?

120 名前:デフォルトの名無しさん mailto:sage [2005/07/09(土) 20:48:02 ]
>>110
全文検索系のアルゴリズムが参考になるんじゃない?
suffix tree とか suffix array とか。
ってもう一月以上前か。

121 名前:デフォルトの名無しさん [2005/08/26(金) 11:16:09 ]
ここでいいのかな。
パトリシアトライ木とハッシュテーブルを比較したら、
ハッシュの方が速い事が多いんですが、
こんなものでしょうか?(特に検索はハッシュが倍以上速い)

なんかパトリシアは苦労して作ったのにこれではちょっと納得いかなかったので。
パトリシアの枝を平衡木にすればマシになるのかな?

122 名前:デフォルトの名無しさん mailto:sage [2005/08/26(金) 13:38:29 ]
なんていうか、苦労と成果は単純に比例する物ではないと思いますハイ。

123 名前:デフォルトの名無しさん [2005/08/26(金) 22:16:26 ]
参考までにベンチ結果を載せておきます。
msは挿入、検索で、検索の速い順に並んでます。
データの種類にもよるでしょうが、自分が対象とするデータはほぼこの順位です。
検索ではTernary Search Trieが健闘してます。
でもtstとtrieはメモリ食います。

>tst (Ternary Search Trie)
55040 件辞書に登録しました。
1268ms
81ms

>hash
55040 件辞書に登録しました。
1224ms
82ms

>pat (Patricia)
55040 件辞書に登録しました。
1444ms
158ms

>trie (Trie)
55040 件辞書に登録しました。
1285ms
224ms



124 名前:デフォルトの名無しさん mailto:sage [2005/08/26(金) 22:25:10 ]
>>1
かまいたちの夜2のネタバレキタ━━━━━━(゚∀゚)━━━━━━ !!

125 名前:デフォルトの名無しさん [2005/08/27(土) 03:16:43 ]
二次元座標に三点を直線状にならないようにとった。それらがなす三角形が、鈍角か鋭角かを座標情報を使って計算により判定する手続きを述べよ。

126 名前:デフォルトの名無しさん mailto:sage [2005/08/27(土) 03:58:42 ]
>>121
patriciaは辞書データ構造に使うんだよ
圧縮が効くしインクリメンタルサーチもできるという特性がある
hashはキーがまるごと必要でしょ

127 名前:デフォルトの名無しさん mailto:sage [2005/08/27(土) 04:05:02 ]
>>125
中学生か?



128 名前:デフォルトの名無しさん [2005/08/27(土) 04:28:18 ]
>>127
条件分岐は一回以下とする。

129 名前:デフォルトの名無しさん mailto:sage [2005/08/27(土) 06:49:06 ]
>>128
普通のパターンだと、条件分岐1回では直角三角形を分離できない(はずだ)けどいいの?
トリッキーにすれば、条件分岐を使わずにできるけど

130 名前:デフォルトの名無しさん mailto:sage [2005/08/27(土) 07:26:28 ]
>>125
は宿題の丸投げか?
自分で考えろよ

131 名前:デフォルトの名無しさん mailto:sage [2005/08/27(土) 10:06:02 ]
>>125
こんなものも自分ひとりで解決できないようじゃ先が思いやられるな

132 名前:デフォルトの名無しさん [2005/08/27(土) 10:41:25 ]
わかったー
cosA・cosB・cosC < 0
なら鈍角だー

133 名前:121 mailto:sage [2005/08/28(日) 06:19:01 ]
コード見直しでそれぞれ多少縮まりました。
tstがこれぐらい差が付くとhashの3倍はメモリ食っても使ってみたくなる。

>tst
57260 件辞書に登録しました。
1275ms
63ms

>hash
57260 件辞書に登録しました。
1284ms
78ms

>pat
57260 件辞書に登録しました。
1450ms
106ms


134 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 07:01:14 ]
>>129
ピーキーなのきぼん

135 名前:デフォルトの名無しさん [2005/09/16(金) 09:46:27 ]
簡単なプログラムだと思うんですが、
なかなかいい方法が浮かばないんで、何かいい方法があれば
教えてください。

二次元配列のデータ
dat[i][j]

という200x200くらいのデータ(モノクロ画像データ)があります。
そのデータに対して、i,j面でスムージングをして、new_dat[i][j]
を作りたいのですが、どうするのが簡単で良い方法でしょうか?
簡単にスムージング(もどき)が出来るアルゴリズムをご存知の方が
居られれば教えてください。


136 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 10:01:42 ]
スムージングって、ローパスとかノイズ除去する奴よね?
線形のローパスフィルタかけるか、中央値フィルタかけたら?

137 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 10:09:32 ]
a00 = 4
a01 = 1
a11 = 1


{lon w
 w = a00*dat[i][j];
 w+= a01*dat[i][j+1]+a01*dat[i][j-1];
 w+= a10*dat[i+1][j]+a01*dat[i-1][j];
new_data[i][j] =w /(a00+2*a01+2*a10);
};
ってな所から始めたら?




138 名前:デフォルトの名無しさん mailto:sage [2005/10/22(土) 08:57:26 ]
アルゴリズムを勉強するのにいい本があったら教えてください


139 名前:デフォルトの名無しさん mailto:sage [2005/10/22(土) 10:44:17 ]
xって値を決める時に
if (x < 0) x = 0;

x = max(x, 0);
はどっちが優れてるの?

140 名前:デフォルトの名無しさん mailto:sage [2005/10/22(土) 18:50:57 ]
>>139
コンパイラによるだろmax関数の解釈とかは、
とりあえずアセンブラの出力を比べてみては。


141 名前:デフォルトの名無しさん mailto:sage [2005/10/22(土) 19:23:39 ]
>>139
最上位ビットを0にするのがいいんじゃないの?

142 名前:デフォルトの名無しさん mailto:sage [2005/10/22(土) 19:45:38 ]
>>139
if (x < 0) x = 0;

143 名前:デフォルトの名無しさん mailto:sage [2005/10/23(日) 14:00:30 ]
>140
アセンブラ読めない、頑張ってみた

---if(x<0) x=0;
+++x=max(x,0)

  movl $1, -4(%ebp)
- cmpl $0, -4(%ebp)
- jns L2
- movl $0, -4(%ebp)
-L2:
+ movl $0, 4(%esp)
+ movl -4(%ebp), %eax
+ movl %eax, (%esp)
+ call _max
+ movl %eax, -4(%ebp)
  movl $0, %eax

左の列が言わんとしてる事はわかるんですが、他は字に見えません
movlとjnsとcmplとcallがどれだけの奴か知らないので臨場感が伝わってきませんでした。

>142
おすすめのポイントはcallの有無?

>141
おー!と思ったけどビット演算は自分の脳に負荷がかかりました

とりあえず右の列
グーグルと一緒にとっつかまえてくる

144 名前:デフォルトの名無しさん mailto:sage [2005/10/23(日) 20:02:39 ]
>>143
max()自体が最適化されてcallがなくなる処理系もある。
>>142 は記述形式がアセンブラに一番近い、つまり

最適化の有無に因らず、どのような処理系でも
「一番速いコード」が生成される「はず」

が根拠だ。

145 名前:デフォルトの名無しさん mailto:sage [2005/10/23(日) 20:54:55 ]
計ってみればいいんじゃない

146 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 07:56:09 ]
if (x < 0) x = 0;
つまり、xが負数ならゼロにするという事は、 2の補数表現であれば
xの最上位ビットが1の時に、xを0にすればいい。

よって x := x and (not (x asr 31) ) という計算と等価となる

 ・符号拡張命令
 ・バレルシフタ
 のどちらかを持っているCPU(x86は両方持ってる)なら
 符号拡張
 NOT
 AND
の3ステップで実現出来る


147 名前:デフォルトの名無しさん mailto:sage [2005/10/28(金) 03:24:19 ]
>>146
計算マンセーの前時代的思考方法だな。
xが整数型であると、どこに書いてある?
という、無駄な突っ込みは別として、その手の置き換えは
「必ず計算が実行される」と言う面から考えると、速くも、
また、美しくもない。

if (x < 0) x = 0;

は、しなくとも良い計算や代入は発生しない。
そう言った意味で

x := x and (not (x asr 31) )

は、問題外。



148 名前:デフォルトの名無しさん mailto:sage [2005/10/28(金) 06:29:38 ]
浮動小数点型でも符号ビットは最初にあるから同じ方式でいけるぞ。
だからもし突っ込むなら、 2の補数の方だろう

149 名前:デフォルトの名無しさん mailto:sage [2005/10/28(金) 07:31:16 ]
2の補数表現でも1の補数でも if (x < 0) x = 0; という演算なら問題ない。
つまり >>147の前半の突っ込みは無駄ではなくて、無知なツッコミ。

後半もちょっと変
if (x < 0) x = 0;  は表現であって、実際に分岐を指示しているわけではない。

この計算は賢いコンパイラなら
最近のX86に対応しているなら 条件付代入命令に変換される可能性が高い
CMP
CMOVS
となる。
ちなみに、浮動小数点命令にも条件付代入命令はある


さて、分岐と演算命令のどちらが高速という話なら、
分岐命令は並列演算の妨げとなるが
演算命令は並列化可能な部分は並列化される故に
命令数が多少多くても現在でも分岐より演算が速く、将来はもっと高速になる可能性が大

並列処理のことを言わず、一昔前のCPUや現在のH8やSHでは
分岐命令は演算命令2〜4つ分のコストを支払わされるのが普通

なお、この部分 x := x and (not (x asr 31) ) も 条件代入も並列化出来ないが
その次に同じような演算があれば先読み実行される可能性があるという事






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

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

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