2011-07-22 37 views
0

我只是想知道是否有一種方法可以將位數「移位」? 我已經使用了Google的搜索結果,並且找不到與我想要的有關的任何內容。 假設我有號碼0b01001101,並且我想將它兩次移到右側的「就地」,將所有落在開頭的數字附加到後面。所以它看起來像0b01010011。 C++中是否有任何函數可以讓我左右移位?位移位

+4

術語「循環移位」是你在找什麼? http://stackoverflow.com/questions/776508/circular-shift-operations-in-c而且你可以谷歌這個術語 – Yuf

+0

好吧,我會如何去做我自己的?如果結果是1,我應該把它與1相加,然後右移1,然後用255或者(或者二進制數的大小)進行或運算?類似的左移方法? – Hondros

+0

@Yuf是的,我認爲這正是我正在尋找的! :D – Hondros

回答

1

你想實現一個rotational shift

這裏有一個模板化的版本應與所有類型的整型的工作(包括短褲,字符,整型,和無符號/都簽署)。

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

雖然這個問答似乎已經在運行,但您應該編輯您的答案,使用「oring」作爲「anding」,最後一個字節是錯誤的操作。 – tinman

0

不,你應該創建自定義一個

+0

這是真實的,儘管簡約,並回答了這個問題 – ShinTakezou

+0

這實在是一個評論,而不是問題的答案。請使用「添加評論」爲作者留下反饋。 – TemplateRex

+0

@rhalbersma好吧,如果我再次讀到這個問題,我認爲我的帖子實際上是一個答案。也許太短(猜這就是爲什麼2 downvotes),但是是正確的。 – Saphrosit

1

使用匯編指令回報率和每次應該做的工作得到了進位標誌的值。

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它應該在每個英特爾處理器上工作雖然 – BlackBear

+0

這不僅是可移植性,但可能比C或C++構造的效率低。 –

0

這是作爲供應商特定的擴展實現的。對於MSVC,您可以使用_rotl8, _rotl16(或_rotr*向右旋轉)。不確定GCC,但你總是可以下降到裝配,並使用rolror

1

自己寫一個,我覺得不難。

先存儲右邊的兩位,然後進行位移。最後用存儲的位填充左邊的兩位。

+0

我想我會這樣做,因爲我需要在Python和C++中實現它。 – Hondros