0

数字を「インプレース」でビットシフトする方法があるかどうか疑問に思っていました。私はそれを正確にグーグルで検索しましたが、やりたいことに関係するものは何も見つかりません。番号0b01001101があり、それを「所定の位置」で右に2回シフトして、先頭にある番号を追加するとします。したがって、0b01010011のようになります。そのように左または右にビットシフトできる関数はC++にありますか?

4

6 に答える 6

1

回転シフトを実装したい

これは、すべてのタイプのint(shorts、chars、ints、およびunsigned / signedを含む)で機能するテンプレート化されたバージョンです。

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;
}
于 2011-07-22T17:27:06.753 に答える
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;
}
于 2011-07-22T17:06:32.757 に答える
1

自分で書いてください。難しいことではないと思います。

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

于 2011-07-22T17:08:11.247 に答える
0

私はそれをシフトしてから最後のバイトを最初にアンディングすることはうまくいくはずだと思います。

于 2011-07-22T17:03:25.197 に答える
0

いいえ、カスタムを作成する必要があります

于 2011-07-22T17:04:26.243 に答える
0

これは、ベンダー固有の拡張機能として実装されています。MSVCの場合、_rotl8、_rotl16(または_rotr*右に回転するため)を使用できます。GCCについてはよくわかりませんが、いつでもアセンブリにドロップして、rolまたはを使用できrorます。

于 2011-07-22T17:07:07.737 に答える