- ベストアンサー
if文の構造について
画像のwidthを取得し、変数widthに代入してある状態とします。 そうすると以下のif文ではどのような判断を行っているのでしょうか? if((width != 1) && (width & (width - 1))) { i = 1; while((sizeToFit ? 2 * i : i) < width) i *= 2; width = i; } 使用言語はobjective-cですが、基本はCやC++と同じはずなのでこちらで質問させていただきました。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。ちょっと修正と補足。 > if((width != 1) && (width & (width - 1))) これは前段の(width != 1)が不要ですね。width=1の時は後段の(width & (width - 1))がfalseになりますから、余分な条件を増やして見づらくしているだけのように思えます。 > whileの中では whileじゃなくてifの中、ですね。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
基本的にはすでに回答のあるとおり「width に最も近い 2 のべきを見つける」という処理なんでしょうけど、なんか中途半端な感じ。なんで if の条件だけ width & (width-1) なんて難しい式を使うかなぁ。「読みやすさ優先」でもっとわかりやすく書くか、「処理速度優先」(になるかどうかは知らんけど) で i & (i-1) を徹底的に使うかのどちらかでいってほしい。 ちなみに全体が if 文の中にあるから「width を変更する」ならバグじゃないです>#3。
お礼
総括的なご回答ありがとうございます。 これはとあるサンプルコードの一部なのですが、パフォーマンス向上を狙ったカスタムができればと思います。
- precog
- ベストアンサー率22% (966/4314)
なんかアセンブラみたいなコードですね。 >if((width != 1) && (width & (width - 1))) { 余分な演算をしないよう事前にチェックしています。widthがintならですけど。 ・width == 1の場合はキャストが不要 (本来は次のwhileが一回も成立しないので不要です) ・widthを-1したとき、元のビットパターンにあった"1"が全てゼロになる場合もキャスト処理を飛ばす (元が0であるか、2のべき乗のとき) ここから、2のべき乗にキャストします。 >i = 1; >while((sizeToFit ? 2 * i : i) < width) sizeToFitはモードスイッチですよね? TRUEで切り捨て、FALSEで切り上げます。パフォーマンス気にするならここに入れるのは間違い。 >i *= 2; 2のべき乗を探してるので2倍してるんでしょう。 >width = i; >} これはバグの香りがします。(^^; if文が成立しないとき、iは不定となります。 パフォーマンスを稼ごうとして、不必要に複雑なロジックにした結果、バグを埋め込んでしまったという、典型的な初心者のコーディングに見えるんですが、、、、(アセンブラを知ってる人ほど陥りやすい罠) そもそも今のCPUは分岐が少ないほうが早いんですけどね。
お礼
学生とはいえ、まだまだ知識不足を痛感します。。。 CPUのパフォーマンスまで考慮に入れた深いご回答、ありがとうございました。
- D-Matsu
- ベストアンサー率45% (1080/2394)
> if((width != 1) && (width & (width - 1))) widthが1ではなく、かつwidthが2の階乗ではない場合にtrueになります。 #なんでそうなるのかはビット演算を勉強してください whileの中ではsizeToFitの値によって「widthより大きい、最小の2の階乗」か「widthより小さい、最大の2の階乗」にwidthを調整しているようですね。
お礼
デバッグをした結果、やはり「widthに最も近いべき乗を見つける」といった処理をしているようでした。 しかし、すべての内容を把握できた訳ではありません。。。 未だに(width & (width - 1))について理解出来ませんが、高校時代にビット計算の勉強はしたので、それを用いるとなればなんとか攻略出来そうです。 訂正までしていただき、ありがとうございました。