• ベストアンサー

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++と同じはずなのでこちらで質問させていただきました。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

No.1です。ちょっと修正と補足。 > if((width != 1) && (width & (width - 1))) これは前段の(width != 1)が不要ですね。width=1の時は後段の(width & (width - 1))がfalseになりますから、余分な条件を増やして見づらくしているだけのように思えます。 > whileの中では whileじゃなくてifの中、ですね。

b2naritomo
質問者

お礼

デバッグをした結果、やはり「widthに最も近いべき乗を見つける」といった処理をしているようでした。 しかし、すべての内容を把握できた訳ではありません。。。 未だに(width & (width - 1))について理解出来ませんが、高校時代にビット計算の勉強はしたので、それを用いるとなればなんとか攻略出来そうです。 訂正までしていただき、ありがとうございました。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

基本的にはすでに回答のあるとおり「width に最も近い 2 のべきを見つける」という処理なんでしょうけど、なんか中途半端な感じ。なんで if の条件だけ width & (width-1) なんて難しい式を使うかなぁ。「読みやすさ優先」でもっとわかりやすく書くか、「処理速度優先」(になるかどうかは知らんけど) で i & (i-1) を徹底的に使うかのどちらかでいってほしい。 ちなみに全体が if 文の中にあるから「width を変更する」ならバグじゃないです>#3。

b2naritomo
質問者

お礼

総括的なご回答ありがとうございます。 これはとあるサンプルコードの一部なのですが、パフォーマンス向上を狙ったカスタムができればと思います。

  • precog
  • ベストアンサー率22% (966/4314)
回答No.3

なんかアセンブラみたいなコードですね。 >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は分岐が少ないほうが早いんですけどね。

b2naritomo
質問者

お礼

学生とはいえ、まだまだ知識不足を痛感します。。。 CPUのパフォーマンスまで考慮に入れた深いご回答、ありがとうございました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

> if((width != 1) && (width & (width - 1))) widthが1ではなく、かつwidthが2の階乗ではない場合にtrueになります。 #なんでそうなるのかはビット演算を勉強してください whileの中ではsizeToFitの値によって「widthより大きい、最小の2の階乗」か「widthより小さい、最大の2の階乗」にwidthを調整しているようですね。

関連するQ&A

  • if文の条件式について

    iPhone OS 3.0、Xcode 3.1.3という環境でobjective-cをベースとしてiPhone向けアプリケーションを作る研究をしています。 どちらかというとC言語の質問になりますが、if文で使う条件式にNSString型で宣言した文字列を使うにはどうすればいでしょうか? NSString *startArea = [[NSString alloc] initWithFormat:@"pt.x > 224 && pt.y < 100"]; というコードでstartAreaに代入されたpt.x > 224 && pt.y < 100という文字列をif文の条件式として使えればと思ってます。 ちなみに、、、 if( startArea ){ 実行したい命令 } という記述をしたところ、ビルドエラーは発生しませんでしたが条件が無視されてしまいました。 他にコードの間違いがあるかもしれませんが、まずはこの内容で判断をお願いします。

  • if文が通りません

    $dataという変数の中に"----"という値が入っているのですが下記のif文が通りません。 if($data == "----"){ echo "成功"; } echoで"----"の値が出力されるのは確認済みです。 スペースも入っていません。 ちなみにif文の前に$data = "----";と書いて値を代入するとうまくいきます。

    • ベストアンサー
    • PHP
  • if文の中のif文・・・について

    質問させていただきます。 if文の中のif文の記述の仕方について質問があります。 例えば if ( x > 0 ){ a = b+c; if ( a > 1) d = e+f; ・・・1 if ( a < 1) d = e-f; ・・・2 if ( a = 1 ) d = 1-g; ・・・3 } h = d + i; aが1より大きい場合は、1の処理を、aが1より小さい場合は2の処理を、aが1と同じであった場合、3の処理をして最終的に、h = d + i;の式の d に代入して h を求めたいと思っているのですが、うまくゆきません。 if文の中のif文の記述はどのようにすればよいのでしょうか? よろしければご教示よろしくお願いします。

  • if文が上手くいかない・・・

     連続投稿失礼します。  if文が上手くいきません。$hensuuの値が間違っているのにもかかわらず、条件があっている時の処理が実行されてしまいます。  なにやら癖になっているようで、if文を書くたびこのような事態が発生します。(PHPに限らず、C言語でまで・・・。)一体何が原因なのでしょうか? <?php $hensuu = "right"; if($hensuu = "wrong"){ print <<<_EOT_ 条件に合ってないはずなのに、こっちが表示されちゃう。 _EOT_; } else { print <<<_DRK_ 本来こっちが表示されるはずなのに、表示されない・・・。 _DRK_; } ?>  よろしくお願いします。

    • ベストアンサー
    • PHP
  • while文とif文

    #include <stdio.h> void main() { char str[2][6] = {"hello","lop"}; int i = 0; while(i < 2){ printf("%s\n", str[i++]); } } 上のプログラムの条件判定の部分にif文を つかうとhelloという文字列しか出力されず while文を使うとhelloとlop 二つ出力され ます。上の条件判定のif文にした時ととwhile 文にした時の違いはどこなのでしょうか?? どなたかご教授よろしくお願いしますm(_ _)m

  • EXCEL IF文で最大値を出す

    最大値はMAXで出せ!といわれると元も子もないですが(^^;) IF文でなんとかならないの?という・・・はい、変わり者のAB型です まあそれはさておきA1,A2,B1,B2の4つを比較したいと思います (4項は全て違う値です) とりあえず =IF(AND(A1>B1),A1,B1) =IF(AND(A2>B2),A2,B2) これをC1,C2に代入し =IF(AND(C1>C2),C1,C2) ただこれでは項目が増えるごとに膨大な代入するセルが必要です ここで変数をn、mとし =IF(AND(n=(AND(A1>B1),A1,B1))>(m=(IF(AND(A2>B2),A2,B2)),n,m) とすれば大丈夫そうなのですが変数を宣言する方法が ネットを探索してもうまく見つけれません。 もしくは別の方法がありそうですが詳しい方助言を いただけないでしょうか?

  • switch文とwhile文を用いたプログラムに関して

    swich文とwhile文を用いたプログラムについて 授業の課題で、swich文とwhile文を用いたプログラムを作りなさい。いう課題が出ました。 5桁以上9桁以下の正の整数を入力し、4で割り切れたとき、何桁の数字かを出力。4でわって1余ったとき、すべての桁の合計を出力。3余ったとき、与えられた数の逆を変数に代入し、その変数を出力(単純に表示するわけではなく、数字として表示) といったものです。 途中からの授業参加で、C言語に関する知識はほとんどありません。do文を用いたプログラムは見つけれたのですが、while文とswich文を用いろということなので、do文は使えないです。 どなたか教えていただけませんか? 今日中にわからないとちょっとやばいです・・・。 よろしくお願いします

  • java for文、if文を使っての三角形

    例:1 23 456 78910 ・・・・・・のようにひょうじさせるプログラムを作成するのに、for文とIf文を使っての三角形を   作成したいのですが、If文の条件式が分からないのとどうしたら、上記のようなプログラムが   出来るのか教えてください。お願いします。 public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ // 行に表示させる個数を表現するための変数がないため今回、新たに変数を用意する。 int a = 1; //行の終わりを改行して1増やすための変数がないため今回、新たに変数を用意する。 int b = 1; // 1~100までの数字を用意する。 for (int i = 1; i <= 100; i++) { //変数iをSystem.out.printを使って変数iをコンソールの中に出力させる。 System.out.print(i); //System.out.println("")を使って改行する。 System.out.println(" "); //変数iに1増加して数字を順番にする。 i++; if(a <= i){ System.out.print(a);

  • PerlのIF文について

    PerlのIF文の判断式につきまして、式全体を変数にしたいのですが、うまくできません。 初歩的な質問で大変恐縮ですが、他の言語を使っている人に聞いてもできるということなので、Perlでもできるような気がするのですが、うまく動かないので教えていただけませんでしょうか。 $ifbun="index(文字列, 検索したい単語) >=0"; if($ifbun){  処理 } とっても簡単な式なのですが、このままですと条件式を加味しない処理結果になっています。 $ifbunの中身をそのままIFの条件式に入れると問題なく条件式どおりの結果が得られるので、プログラムは間違っていないと思うのですが、変数に入れると、条件を加味していない結果が出てきます。 どなたかお分かりの方がいらっしゃいましたら教えてください。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • エクセル2000のマクロで、if文が想定通りに動かない

    90から93列目にかけて、データが 0又は3~4桁の数字が入っている状態です。 4810,0,0,2430 以下はマクロの抜粋です。 やりたいことは、0でなければ各変数に1を代入し、95列めに合計を入力します。 If Cells(i, 90) <> 0 Then w = 1 If Cells(i, 91) <> 0 Then x = 1 If Cells(i, 92) <> 0 Then y = 1 If Cells(i, 93) <> 0 Then z = 1 Cells(i, 95).Value = w + x + y + z このマクロを実行しますと、実際には0でない列が2列にもかかわらず、95列目に3と入力されてしまいます。1行ずつ実行してみたら、if文の3行目の92列目の判定が変です。 実行中に、カーソルをかざすとCells(1, 92)=0と表示されるのですが、合計を代入するところの y には1が代入されてしまっています。 何か間違っているんだと思いますが、分かりません。よろしくお願いします。

専門家に質問してみよう