2010-01-13 85 views
4

如何反轉和旋轉十六進制數字並用位運算符返回C中的數字?c中的位操作

例如:

0xabcd -> 0xdcba 

0xabcd -> 0xdabc 
+0

的第二一個是由4位按位旋轉。請參閱http://stackoverflow.com/questions/776508/best-practices-for-circular-shift-rotate-operations-in-c瞭解防止未定義行爲的編譯器友好旋轉的最佳實踐。 – 2015-08-17 21:15:35

回答

13

很難知道從哪裏開始這個問題。另外我聞到功課。

幾點:

  • 有沒有這樣的事,作爲一個 「十六進制數」。十六進制只是一個符號。你如何反轉和旋轉十進制數並返回C中的數字?例如:

    1776 - > 6771

    1776 - > 6771?

  • 爲了解決這個問題,就需要位置符號的深刻理解,無論是基地10,基地16,基地2個,或者你有什麼。

  • 所有你需要的可以通過加,減,乘和除。 那些號碼的操作。模量也很有幫助。

  • 如果你碰巧要乘以或除以2的冪,我向你推薦C左移<<和右移>>操作符。這些適用於使用C類型unsignedunsigned long表示的數字。

+6

+1用於解釋(以適當粗略的方式)*數字*及其在特定*基數*中的表示法之間的區別。 – 2010-01-13 04:05:46

+0

真的嗎?當人們認爲你不知道定義時,我很惱火。僅僅因爲你使用了一個語義錯誤的詞並不意味着你不知道它是什麼。 – Louis 2010-01-13 04:59:40

+0

@路易斯:我不認爲諾曼暗示他不知道它是什麼,我認爲他試圖讓這個區別更清楚。事實上,十進制中的「10」是十六進制中的「A」,但它們是相同的,所以在十六進制中「切換」數字123將是一種數學上不同的操作,人。 – 2010-01-13 05:41:20

-1

要使用位操作交換數:

執行使用具有適當的掩模的原始數目,以提取從原始數是十六進制數字(4位)按位與運算。

將這個提取的位模式移到它的新位置。

按位或重新定位位模式在一起。

希望這會有所幫助。

1

十六進制數字是數字,正如諾曼的答案指出的那樣。然而,1個十六進制數字= 4位,所以這些操作實際上是有意義的,因爲您可能想要對整數值進行操作。

第二個按位旋轉4位。請參閱Best practices for circular shift (rotate) operations in C++以獲得有關編譯器友好旋轉的最佳實踐,以防止C/C++未定義行爲。

如果您的輸入不是8,16,32或64位,那麼您可能需要手動移動+掩碼,而不是依靠零移位。


第一個將需要更多的代碼:它顛倒半字節的順序。沒有機器指令,或者一次只需要對整個數字進行一些按位操作的簡單方法。

我認爲你必須扭轉字節的順序,然後顛倒每個字節內的半字節順序(8位旋轉4)。

0

爲了好玩,遵循適用於任何寬度數字的遞歸解決方案。

#include <limits.h> 
unsigned ReverseHex(unsigned x, unsigned DigitWidth) { 
    if (DigitWidth <= 1) { 
    return x; 
    } 
    unsigned SideDigitWidth = DigitWidth/2; 
    unsigned SideBitWidth = SideDigitWidth * 4; 
    unsigned CenterAndRightDigitWidth = DigitWidth - SideDigitWidth; 
    unsigned CenterAndRightBitWidth = CenterAndRightDigitWidth * 4; 
    unsigned CenterAndRight = x & ((1u << CenterAndRightBitWidth) - 1); 
    unsigned Right = x & ((1u << SideBitWidth) - 1); 
    unsigned Center = CenterAndRight - Right; 

    return ReverseHex(x >> CenterAndRightBitWidth, SideDigitWidth) + Center 
     + (ReverseHex(Right, SideDigitWidth) << CenterAndRightBitWidth); 
} 

int main(void) { 
    printf("%X\n", ReverseHex(0x1234, 4)); 
    printf("%X\n", ReverseHex(0x12345, 5)); 
    printf("%X\n", ReverseHex(0x1234567, 7)); 
    printf("%X\n", ReverseHex(0x12345678, 8)); 
    return 0; 
} 

輸出

4321 
54321 
7654321 
87654321