パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

もうやらなくていい昔のコーディングテクニックあれこれ」記事へのコメント

  • シフト演算 (スコア:3, 興味深い)

    by fcp (32783) on 2009年05月04日 23時20分 (#1559271) ホームページ 日記

    以前はコンパイラーが賢くなかったし乗算が遅かったので、 C 言語の入門書には「y = x * 8; でなく y = x << 3; を使いましょう」などと書かれていたものです。 z = x * 8 + 1; と等価のつもりで z = x << 3 + 1; と書いてバグったのも良い思い出です。

    • Re:シフト演算 (スコア:4, 参考になる)

      by hetareDAIO (17407) on 2009年05月05日 14時13分 (#1559502) 日記

      除算も同じシフト演算で置き換えしてましたですよね。ただ、組み込み系のような、いつまで経っても進歩しないアホなコンパイラを使わざるを得ないケースとかですと、未だ現役の知識なのですw

      それはさておき、

      z = x * 8 + 1; と等価のつもりで z = x << 3 + 1; と書いてバグった

      私の場合は、演算子の優先順位というのを頭に入れるのが面倒でしたので、四則演算の組み合わせでも括弧をつける癖をつけてました。10年前はアホだの無駄だのひどい扱いを受けていましたが、今は「コーディングの鏡」扱いされるのって、複雑な気分です。

      余談ですが、CPUの命令によっては高級言語を意識した命令があって、例に挙げられたような n * { 2,4,8 } + { 0-7 } のような演算を1命令でこなせるモノもあり、コンパイラによってはちゃんと置き換えしてくれるものもありますね。昔はインラインアセンブラ使って人力コンパイルしたりしてました。

      --
      ほえほえ
      親コメント
      • 除算も同じシフト演算で置き換えしてましたですよね。

        はい、除算もですね。負の数が出てくると除算と右シフトでは挙動が違ってまた悩んだりしました。

        除算も同じシフト演算で置き換えしてましたですよね。ただ、組み込み系のような、いつまで経っても進歩しないアホなコンパイラを使わざるを得ないケースとかですと、未だ現役の知識なのですw

        大変そうです……。

        親コメント
    • by Anonymous Coward
      何がいけないん?
      • by greentea (17971) on 2009年05月05日 15時33分 (#1559543) 日記
        演算子の順序の問題で x << 3 + 1 は
        (x << 3) + 1 ではなく x << (3 + 1) と解釈される、ということではないかと。
        --
        1を聞いて0を知れ!
        親コメント
        • (x << 3) + 1 ではなく x << (3 + 1) と解釈される、ということではないかと。

          はい、そういうことでした。どうしてシフト演算子の優先順位は * や / と同じでないんだ、と文句を言いたくなったものです。

          親コメント
          • by greentea (17971) on 2009年05月06日 8時45分 (#1559894) 日記

            シフト演算子の優先順位が自然に受け入れられる、不自然でない例を考えてみたのですが、
            foo = 四則演算1 4 | 四則演算2 ;
            くらいしか思い浮かびませんでした。

            こんな危なっかしいメモリ節約テクニックも、今では使わない方がいい昔のコーディングテクですよね。

            # 都市伝説っぽいが、何かのゲームのデバッグに高橋名人が関わったとき、彼は偶然にも「1秒間に16回以上ボタンを押すと異常が発生する」バグを見つけたことがあるらしい。

            --
            1を聞いて0を知れ!
            親コメント
            • シフト演算子の優先順位が自然に受け入れられる、不自然でない例を考えてみたのですが、
              foo = 四則演算1 4 | 四則演算2 ;
              くらいしか思い浮かびませんでした。

              「foo = 四則演算1 << 4 | 四則演算2 ;」ですよね。たしかにビットフィールドのようなものをビット演算を使って自力で実現しようとすることが頻繁にあれば、現状の優先順位に多少は意味があるかもしれませんね。おっしゃる通り、今や普通の PC アプリケーション開発では使われない手法だと思いますが。

              親コメント
        • by Anonymous Coward
          ていねいな解説ありがとう

ハッカーとクラッカーの違い。大してないと思います -- あるアレゲ

処理中...