アカウント名:
パスワード:
以前はコンパイラーが賢くなかったし乗算が遅かったので、 C 言語の入門書には「y = x * 8; でなく y = x << 3; を使いましょう」などと書かれていたものです。 z = x * 8 + 1; と等価のつもりで z = x << 3 + 1; と書いてバグったのも良い思い出です。
除算も同じシフト演算で置き換えしてましたですよね。ただ、組み込み系のような、いつまで経っても進歩しないアホなコンパイラを使わざるを得ないケースとかですと、未だ現役の知識なのですw
それはさておき、
z = x * 8 + 1; と等価のつもりで z = x << 3 + 1; と書いてバグった
私の場合は、演算子の優先順位というのを頭に入れるのが面倒でしたので、四則演算の組み合わせでも括弧をつける癖をつけてました。10年前はアホだの無駄だのひどい扱いを受けていましたが、今は「コーディングの鏡」扱いされるのって、複雑な気分です。
余談ですが、CPUの命令によっては高級言語を意識した命令があって、例に挙げられたような n * { 2,4,8 } + { 0-7 } のような演算を1命令でこなせるモノもあり、コンパイラによってはちゃんと置き換えしてくれるものもありますね。昔はインラインアセンブラ使って人力コンパイルしたりしてました。
除算も同じシフト演算で置き換えしてましたですよね。
はい、除算もですね。負の数が出てくると除算と右シフトでは挙動が違ってまた悩んだりしました。
大変そうです……。
(x << 3) + 1 ではなく x << (3 + 1) と解釈される、ということではないかと。
はい、そういうことでした。どうしてシフト演算子の優先順位は * や / と同じでないんだ、と文句を言いたくなったものです。
シフト演算子の優先順位が自然に受け入れられる、不自然でない例を考えてみたのですが、foo = 四則演算1 4 | 四則演算2 ;くらいしか思い浮かびませんでした。
こんな危なっかしいメモリ節約テクニックも、今では使わない方がいい昔のコーディングテクですよね。
# 都市伝説っぽいが、何かのゲームのデバッグに高橋名人が関わったとき、彼は偶然にも「1秒間に16回以上ボタンを押すと異常が発生する」バグを見つけたことがあるらしい。
シフト演算子の優先順位が自然に受け入れられる、不自然でない例を考えてみたのですが、 foo = 四則演算1 4 | 四則演算2 ; くらいしか思い浮かびませんでした。
「foo = 四則演算1 << 4 | 四則演算2 ;」ですよね。たしかにビットフィールドのようなものをビット演算を使って自力で実現しようとすることが頻繁にあれば、現状の優先順位に多少は意味があるかもしれませんね。おっしゃる通り、今や普通の PC アプリケーション開発では使われない手法だと思いますが。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
にわかな奴ほど語りたがる -- あるハッカー
シフト演算 (スコア:3, 興味深い)
以前はコンパイラーが賢くなかったし乗算が遅かったので、 C 言語の入門書には「y = x * 8; でなく y = x << 3; を使いましょう」などと書かれていたものです。 z = x * 8 + 1; と等価のつもりで z = x << 3 + 1; と書いてバグったのも良い思い出です。
Re:シフト演算 (スコア:4, 参考になる)
除算も同じシフト演算で置き換えしてましたですよね。ただ、組み込み系のような、いつまで経っても進歩しないアホなコンパイラを使わざるを得ないケースとかですと、未だ現役の知識なのですw
それはさておき、
私の場合は、演算子の優先順位というのを頭に入れるのが面倒でしたので、四則演算の組み合わせでも括弧をつける癖をつけてました。10年前はアホだの無駄だのひどい扱いを受けていましたが、今は「コーディングの鏡」扱いされるのって、複雑な気分です。
余談ですが、CPUの命令によっては高級言語を意識した命令があって、例に挙げられたような n * { 2,4,8 } + { 0-7 } のような演算を1命令でこなせるモノもあり、コンパイラによってはちゃんと置き換えしてくれるものもありますね。昔はインラインアセンブラ使って人力コンパイルしたりしてました。
ほえほえ
Re:シフト演算 (スコア:2)
はい、除算もですね。負の数が出てくると除算と右シフトでは挙動が違ってまた悩んだりしました。
大変そうです……。
Re: (スコア:0)
Re:シフト演算 (スコア:1)
(x << 3) + 1 ではなく x << (3 + 1) と解釈される、ということではないかと。
1を聞いて0を知れ!
Re:シフト演算 (スコア:2)
はい、そういうことでした。どうしてシフト演算子の優先順位は * や / と同じでないんだ、と文句を言いたくなったものです。
Re:シフト演算 (スコア:1)
シフト演算子の優先順位が自然に受け入れられる、不自然でない例を考えてみたのですが、
foo = 四則演算1 4 | 四則演算2 ;
くらいしか思い浮かびませんでした。
こんな危なっかしいメモリ節約テクニックも、今では使わない方がいい昔のコーディングテクですよね。
# 都市伝説っぽいが、何かのゲームのデバッグに高橋名人が関わったとき、彼は偶然にも「1秒間に16回以上ボタンを押すと異常が発生する」バグを見つけたことがあるらしい。
1を聞いて0を知れ!
Re:シフト演算 (スコア:2)
「foo = 四則演算1 << 4 | 四則演算2 ;」ですよね。たしかにビットフィールドのようなものをビット演算を使って自力で実現しようとすることが頻繁にあれば、現状の優先順位に多少は意味があるかもしれませんね。おっしゃる通り、今や普通の PC アプリケーション開発では使われない手法だと思いますが。
Re: (スコア:0)