我有一個long
變量,我需要顛倒它的字節順序。例如:B1, B2, ... , B8
我應該返回一個包含B8, B7, ..., B1
的長整數。我怎樣才能通過使用按位操作?反向字節長的順序
Q
反向字節長的順序
3
A
回答
6
或者更多的方法,其中包括按位運算,你可以參考這個stack overflow question
繼承人另一個你可能喜歡的方式,我還是建議以上,但它比按位好你可以輕鬆地犯錯誤。
byte[] bytes = ByteBuffer.allocate(8).putLong(someLong).array();
for (int left = 0, right = bytes.length - 1; left < right; ++left, --right) {
byte temp = bytes[left];
bytes[left] = bytes[right];
bytes[right] = temp;
}
我試圖從按位解決方案,引導你走,因爲他們是累贅,很容易亂了,如果你不知道你在做什麼......但按位應該是這樣的:
byte[] bytes = new byte[8];
// set the byte array from smallest to largest byte
for(int i = 0; i < 8; ++i) {
byte[i] = (your_long >> i*8) & 0xFF;
}
// build the new long from largest to smallest byte (reversed)
long l = ((buf[0] & 0xFFL) << 56) |
((buf[1] & 0xFFL) << 48) |
((buf[2] & 0xFFL) << 40) |
((buf[3] & 0xFFL) << 32) |
((buf[4] & 0xFFL) << 24) |
((buf[5] & 0xFFL) << 16) |
((buf[6] & 0xFFL) << 8) |
((buf[7] & 0xFFL) << 0) ;
2
您可能想要使用Long.reverseBytes
而不是按位操作。詳細信息請參見Java Reference。
否則,您可以看看Long.java
中的JDK源文件(位於JDK文件夾中的src.zip),但請注意Oracle的版權。
1
這裏是一個老把戲,你可以用它來交換尾段寄存器:
static long swapblock(long a, long mask, int shift) {
long b1 = a & mask; // extract block
long b2 = a^b1; // extract remaining bits
return (b1 << shift) |
((b2 >> shift) & mask); // mask again to clear sign extension
}
static long endianswap(long a) {
a = swapblock(a, 0x00000000ffffffffL, 32);
a = swapblock(a, 0x0000ffff0000ffffL, 16);
a = swapblock(a, 0x00ff00ff00ff00ffL, 8);
return a;
}
的想法是,直到達到您想要停止在所需的水平,逐步換子塊。通過添加大小爲4,2和1的交換,您可以將其更改爲位鏡像功能。
由於缺少java中的無符號類型,只有一個棘手的問題。在向右移位時需要屏蔽高位,因爲符號位被移位量複製,用高位位填充1(0x8000000000000000 >> 8
爲0xFF80000000000000
)。
0
long reverse(long x){
x = (x >> 32) | (x << 32); // step 1
x = ((x & 0xffff0000ffff0000) >> 16)
| ((x & 0x0000ffff0000ffff) << 16); // step 2
x = ((x & 0xff00ff00ff00ff00) >> 8)
| ((x & 0x00ff00ff00ff00ff) << 8); // step 3
return x;
}
如果我們假設位運算符在O(1)時間工作,反向函數工作在O(LG(比特數))的時間。
說明
步驟0:B1 B2 B3 B4 B5 B6 B7 B8
第1步:B5 B6 B7 B8 B1 B2 B3 B4
步驟2:B7 B8 B5 B6 B3 B4 B1 B2
第3步:B8 B7 B6 B5 B4 B3 B2 B1
0
平原答案與循環:只有
public static long byteReverse(long a) {
long result = 0;
for(int i = 0; i < 8; i++){
// grab the byte in the ith place
long x = (a >> (i*8)) & (0b11111111);
result <<= 8;
result |= x;
}
return result;
}
按位:
public static long byteReverse(long a) {
a = (a << 32) | (a >>> 32);
a = ((a & 0xffff0000ffff0000L) >>> 16) | ((a & 0x0000ffff0000ffffL) << 16);
a = ((a & 0x00ff00ff00ff00ffL) << 8) | ((a & 0xff00ff00ff00ff00L) >>> 8);
return a;
}
相關問題
- 1. 反向字節順序
- 2. Delphi字節的反向順序
- 3. 反向字節順序登記
- 4. 反向字符串順序
- 5. fwrite寫入反向數字字節順序
- 6. c中的字節反轉順序
- 7. ASCII IP到主機字節順序長
- 8. ObservableCollection的反向順序
- 9. 反向字符串列表順序
- 10. R,GGPLOT2:反向字母順序
- 11. 反向Python中的字符串在同一時間(網絡字節順序)
- 12. F# - 反向管道順序
- 13. 反向輸出順序
- 14. 字符串反向順序像「你好Word」反向在PHP中的「字你好」
- 15. 「IBM PC」字節順序的字節順序?
- 16. 網絡字節順序來承載java中的字節順序
- 17. 混淆網絡字節順序和主機字節順序
- 18. 網絡字節順序來承載字節順序轉換Java
- 19. 的NSArray和字節順序
- 20. 「反向」 的NSMutableArray的元素順序
- 21. iOS反向tableView排序順序
- 22. 的Python:反向順序列表
- 23. SQL查詢輸出的反向順序
- 24. 堆棧元素的反向順序
- 25. 文章的反向日期順序PHP
- 26. THREE.js中的反向頂點順序
- 27. 旋轉矩陣的反向順序
- 28. ggplot2:時間日期的反向順序
- 29. 腳本中的反向日期順序
- 30. PHP獲取數組的反向順序
你在使用endian-ness嗎? – 2012-04-21 14:44:35