回答
在僞碼:
x = ((x & 0b10101010) >> 1) | ((x & 0b01010101) << 1)
它通過分別處理每個位對低位和高位然後結合結果:
- 表達
x & 0b10101010
提取高位,然後>> 1
將它移到低位位置。 - 類似地,表達式
(x & 0b01010101) << 1
從每對中提取低位並將其移位到高位位置。 - 然後這兩部分使用按位或組合。
由於不是所有的語言都允許你直接寫二進制文字,你可以把它們寫在例如十六進制:
Binary Hexadecimal Decimal 0b10101010 0xaa 170 0b01010101 0x55 85
鑑於並非所有語言都遵守模式0b ...,所以可能值得注意的是它分別是十六進制的0xAA和0x55。 – userx 2010-09-21 08:29:38
@userx:+1是的,這絕對值得注意。添加。 – 2010-09-21 08:34:06
謝謝馬克。這真棒方法! – RaviPathak 2010-09-21 09:17:59
我會第一個代碼它「手寫」 - 也就是在幾個明顯的,明確的階段說,並用它來驗證該單元測試,我在的地方都工作正常,那麼只有轉向更深奧的位操作解決方案,如果我需要性能(並且通過所述改進提供額外的性能)
代碼爲人先,計算機秒。
-1完全不能回答問題 – Tomas 2010-09-21 08:30:06
- 讓兩位口罩,一個包含所有偶數位並含有一個不均勻的位(
10101010
和01010101
)。 - 使用按位並將輸入過濾爲兩個數字,一個將所有偶數位置零,另一個將所有不均勻位置零。
- 將僅包含偶數位的數字向左移一位,而將另一位向右移一位
- 按位或將它們組合在一起。
爲16位(而不是實際的代碼)實施例:
short swap_bit_pair(short i) {
return ((i & 0101010110101010b) >> 1) | ((i & 0x0101010101010101b) << 1));
}
最優雅和靈活的解決方案是,正如其他人說,一個「梳」掩模同時適用於偶數和奇數位然後,分別將它們左右移動一個位置,以按位或按比例合併它們。
您可能想要考慮的另一個解決方案是利用相對較小的數據類型。您可以創建256個值,其靜態初始化爲要用作輸出到您的輸入值的查找表:
const unsigned char lookup[] = { 0x02, 0x01, 0x03, 0x08, 0x0A, 0x09, 0x0B ...
每個值放入數組的代表指數的轉型。所以,如果你再這樣做:
unsigned char out = lookup[ 0xAA ];
out
將包含0x55
這是更麻煩,比第一種方法不夠靈活(如果你想從8位遷移到16?),但確實有如果執行大量的這些操作,它的速度將顯着提高。
假設你的電話號碼是num
。
首先找到偶數位置位:
num & oxAAAAAAAA
第二步找到奇姿位:
num & ox55555555
第三步改變位置奇位置,甚至位置位和偶數位位奇數位置位:
Even = (num & oxAAAAAAAA)>>1
Odd = (num & 0x55555555)<<1
最後一步...... result = Even | Odd
打印結果
- 1. 交換字節中的每一位
- 2. 交換2個字節的位長度
- 3. 用較高的一個(8-15)一個交換低位字節(0-7)
- 4. Ç40位字節交換(端)
- 5. 在一個字節中交換兩個半字節
- 6. C++ 32位字的字節交換
- 7. 如何將兩個字節轉換爲一個16位數字?
- 8. 如何將rgb(三個字節)轉換爲位圖格式的一個字節?
- 9. arrayList交換一個數字?
- 10. 使用引入nokogiri對文本節點交換一個DocumentFragment的
- 11. 使用JRebel交換一個類的字節碼
- 12. 如何清除一個字節的位?
- 13. 打印一個字節的位
- 14. 讀取下一個字節的位數
- 15. 如何檢查一個字節的位[]
- 16. 我想轉換一個字節至3個位數在VB.net
- 17. 將2字節轉換爲IDL中的一個16位整數
- 18. 爲什麼你必須將一個字節的按位操作轉換爲Java中的一個字節?
- 19. 將一個字節的字符串轉換爲一個unsigned int
- 20. 將4個字節的字節轉換爲一個int
- 21. 雙字節交換
- 22. 如何用另一個字節的LSB替換一個字節的LSB
- 23. 在C++中交換第一個和最後一個節點
- 24. 轉換一個結構的字節
- 25. 交換一個數組中的數字
- 26. 交換整數的2個字節
- 27. PIC C18:從一個字節讀取位
- 28. 將一個字節拆分爲位
- 29. 如何將位寫入一個字節?
- 30. 轉換一個字節或int位集合
請告訴我問題嗎? – JamesM 2010-09-21 08:12:08
對不起,我給你的第一個答案,如果它讓你困惑。我完全閱讀你之前/之後的錯誤。 – colithium 2010-09-21 08:18:12
@JamesM:對不起,如果它不明顯,但問題是:在一個字節中,配對比如,如果字節是10101100,那麼將這些比特配對看起來像「10 - 10 - 11 - 00」。現在,如果我們交換單個對,它會變成 - '01 - 01 - 11 - 00'。我需要實現交換的機制 – RaviPathak 2010-09-21 09:13:18