2011-07-22 8 views
0

ビットをシフトする方法があるかどうか疑問に思っていましたか? 私はそれを正確に探せました。私は自分がしたいことに関係するものは見つけられません。 私は0b01001101という数字を持っていますが、最初に落ちる数字を付け加えて、それを右に2回シフトしたいとします。したがって、0b01010011のようになります。 C++で左または右にビットシフトできる関数はありますか?ビットシフトする場所

+4

あなたが探している用語「循環シフト」はありますか? http://stackoverflow.com/questions/776508/circular-shift-operations-in-cまた、あなたはその言葉をgoogleすることができます – Yuf

+0

さて、私は自分のことをどうやって作りますか?私はちょうどそれと1と、結果が1なら、右に1シフトし、次にORでそれを255とするか、それともバイナリが大きいか?同様の左シフトの方法? – Hondros

+0

@Yufはい、私はそれがまさに私が探していたものだと思います! :D – Hondros

答えて

1

は、ここで(ショートパンツ、文字、int型、および符号なし/似て署名を含む)intのすべてのタイプで動作するはずテンプレート化バージョンです。

template<class T> 
T rotate_shift_right(T x, int shift) 
{ 
    if ((shift > 0) && (shift < (sizeof(x)*8))) 
    { 
     x = ((unsigned)x >> shift) | (x << (sizeof(x) * 8 - shift)); 
    } 
    return x; 
} 

template<class T> 
T rotate_shift_left(T x, int shift) 
{ 
    if ((shift > 0) && (shift < (sizeof(x)*8))) 
    { 
     x = (x << shift) | (((unsigned)x) >> (sizeof(x) * 8 - shift)); 
    } 
    return x; 
} 
0

私はそれをシフトし、最後に最後のバイトを最初に合わせることが効果的だと思います。

+0

このQ&Aは一見、そのコースを実行していますが、最後のバイトが間違った操作であることを "anding"として使用する答えを編集する必要があります。 – tinman

0

いいえ、あなたはあなたのカスタム1

+0

これは真実ですが、最小限ですが、質問に答えます – ShinTakezou

+0

これは本当にコメントであり、質問に対する回答ではありません。著者にフィードバックを残すには、「コメントを追加」を使用してください。 – TemplateRex

+0

@rhalbersmaまあ、もう一度質問を読むと、私の投稿は実際には答えだと思う。たぶん短すぎるかもしれません(2つのダウンボックスがあるのは当然ですが)が正しいです。 – Saphrosit

1

アセンブリ命令のRORを使用し、キャリーフラグの値の作業を行う必要があるたびに取得を作成する必要があります。

int rotate(int x, int n) 
{ 
    for(int i = 0; i < n; i++) { 
     __asm { 
      ror x, 1   ; rotate and store limit bit in cf 
      lahf     ; get part of flags in ah 
      and ah, 1   ; get only the cf 
      shl eax, 31   ; put it at the end 
      and x, eax   ; and store in x 
     } 
    } 

    return x; 
} 
+6

私は狂った組立スキルに感心していますが、私はこのコードが莫大な移植性の問題を加えるだろうと思います。 – riwalk

+0

@ Stargazer712:それはメダルの反対側です:PそれはすべてのIntelのプロセッサで動作するはずですが、 – BlackBear

+0

です。それは移植性だけでなく、おそらくCまたはC++構文より効率が悪いです。 –

0

これは、ベンダー固有の拡張機能として実装されています。 MSVCの場合は、_rotl8, _rotl16(または右に回転する場合は_rotr*)を使用できます。 GCCについては不明ですが、いつでもアセンブリに落として、rolまたはrorを使用することができます。

1

あなた自身を書くと、難しくないと思います。

最初に右の2ビットを格納し、次にビットシフトを行います。最後に、格納されたビットで左の2ビットを埋めます。あなたはrotational shift

を実装したい

+0

私はPythonとC++の両方でそれを実装する必要があるので、私はこれをやると思います。 – Hondros