c中的位操作
回答
很難知道從哪裏開始這個問題。另外我聞到功課。
幾點:
有沒有這樣的事,作爲一個 「十六進制數」。十六進制只是一個符號。你如何反轉和旋轉十進制數並返回C中的數字?例如:
1776 - > 6771
1776 - > 6771?
爲了解決這個問題,就需要位置符號的深刻理解,無論是基地10,基地16,基地2個,或者你有什麼。
所有你需要的可以通過加,減,乘和除。 那些是號碼的操作。模量也很有幫助。
如果你碰巧要乘以或除以2的冪,我向你推薦C左移
<<
和右移>>
操作符。這些適用於使用C類型unsigned
或unsigned long
表示的數字。
+1用於解釋(以適當粗略的方式)*數字*及其在特定*基數*中的表示法之間的區別。 – 2010-01-13 04:05:46
真的嗎?當人們認爲你不知道定義時,我很惱火。僅僅因爲你使用了一個語義錯誤的詞並不意味着你不知道它是什麼。 – Louis 2010-01-13 04:59:40
@路易斯:我不認爲諾曼暗示他不知道它是什麼,我認爲他試圖讓這個區別更清楚。事實上,十進制中的「10」是十六進制中的「A」,但它們是相同的,所以在十六進制中「切換」數字123將是一種數學上不同的操作,人。 – 2010-01-13 05:41:20
要使用位操作交換數:
執行使用具有適當的掩模的原始數目,以提取從原始數是十六進制數字(4位)按位與運算。
將這個提取的位模式移到它的新位置。
按位或重新定位位模式在一起。
希望這會有所幫助。
十六進制數字是數字,正如諾曼的答案指出的那樣。然而,1個十六進制數字= 4位,所以這些操作實際上是有意義的,因爲您可能想要對整數值進行操作。
第二個按位旋轉4位。請參閱Best practices for circular shift (rotate) operations in C++以獲得有關編譯器友好旋轉的最佳實踐,以防止C/C++未定義行爲。
如果您的輸入不是8,16,32或64位,那麼您可能需要手動移動+掩碼,而不是依靠零移位。
第一個將需要更多的代碼:它顛倒半字節的順序。沒有機器指令,或者一次只需要對整個數字進行一些按位操作的簡單方法。
我認爲你必須扭轉字節的順序,然後顛倒每個字節內的半字節順序(8位旋轉4)。
爲了好玩,遵循適用於任何寬度數字的遞歸解決方案。
#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
- 1. c - 解密中的位操作/操作
- 2. C++位操作
- 3. 位C操作
- 4. 按位C操作
- 5. C位操作相關位
- 6. 單位對多位的c位操作
- 7. ANSI C位操作庫C
- 8. C位操作的難題
- 9. C中的位操作 - 內置函數
- 10. C#中的位圖字節操作
- 11. C編碼中的按位操作
- 12. C++ - 操作浮點數值中的位
- 13. C中BigInteger的二進制/位操作#
- 14. 位操作澄清用C
- 15. c - 位操作困難
- 16. C位操作問題
- 17. 位操作出錯C
- 18. 反向位操作/ C++
- 19. C位操作邏輯(BITAND)
- 20. 按位操作的操作
- 21. 在C程序中操作「粘性位」
- 22. 確定從32位操作系統或64位操作系統C/C++應用
- 23. C++中的64位整數的按位(Bitshift)操作
- 24. 32位體系結構中的64位操作數的操作?
- 25. 使用C++ boost庫的按位操作
- 26. C按位操作的行爲
- 27. C中的位操作 - 爲了刪除最高位
- 28. 按位運算符與C#中位操作的.NET抽象
- 29. C++中雙操作的新操作
- 30. 位操作中的Java
的第二一個是由4位按位旋轉。請參閱http://stackoverflow.com/questions/776508/best-practices-for-circular-shift-rotate-operations-in-c瞭解防止未定義行爲的編譯器友好旋轉的最佳實踐。 – 2015-08-17 21:15:35