Ruby で論理シフト演算を行いたいのですが、よい方法を教えてください。

回答の条件
  • 1人3回まで
  • 登録:2006/09/13 17:26:00
  • 終了:2006/09/13 19:29:07

回答(2件)

id:furutanian No.1

furutanian回答回数112ベストアンサー獲得回数142006/09/13 17:29:34

Cと同様に「<<」と「>>」演算子が使えます。

#!/usr/bin/ruby

p 3 << 2

p 12 >> 2

id:typos24

それって算術シフトじゃないでしょうか?

http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/shift.htm

さすがにその辺は大丈夫です。。

JavaScript でいう「>>>」がやりたいんです。

2006/09/13 17:37:03
id:furutanian No.2

furutanian回答回数112ベストアンサー獲得回数142006/09/13 18:26:29

ポイント100pt

失礼しました。ではこんな感じでは?

x = 12

y = -12

p ((x + (x > 0 ? 0 : 2 ** 64)) >> 2)

p ((y + (y > 0 ? 0 : 2 ** 64)) >> 2)

論理シフトには桁が有限である必要があるので、指定しなければなりません。

id:typos24

ありがとうございます!

でも数学弱いんでよくわかりませんw。

JavaScriptと結果が違うようですが、これはどちらが正しいのでしょうか。

javascript:alert(-12>>>2)

もっと簡単な方法あればお願いします。。

2006/09/13 18:43:19
  • id:furutanian
    JavaScriptの場合は32bitでの演算のようです。
    64を32に変更してください。
    #しかし、どういった用途で論理シフトが必要なんでしょう……?
  • id:kurukuru-neko

    FixNumが4以外に注意
    v=-12;
    uv=v & ~(~0<< (v.size*8));
    p v,v.size;
    p uv>>2;
    p sprintf("%#b",uv);
    p sprintf("%#b",uv>>2);

  • id:typos24
    furutanian さん、ありがとうございました。
    最後のは自分で調べるべきでしたが、つい楽をしてしまいました。。

    とある Web サービス (Googleですけど。。) から情報を取得する際に、パラメータとしてチェックサムを送信しなければならず、その際に論理シフトが必要になります。

    とても助かりました。
  • id:typos24
    kurukuru-neko さん、情報ありがとうございます。
    参考にします。

    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません