1. 前言
Integer.reverse(int i):二进制按位反转
Integer.reverseByte(int i):二进制按byte反转
2. 源码
(1) Integer.reverse(int i):二进制按位反转
public static int reverse(int i) {
// HD, Figure 7-1
i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;//第一步
i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;//第二步
i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;//第三步
i = (i << 24) | ((i & 0xff00) << 8) |((i >>> 8) & 0xff00) | (i >>> 24);//第四步
return i;
}
解析如下,i,设
第一步:计算 i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555( & 优先级大于 | )
(i & 0x55555555) << 1的结果为
(i>>>1) & 0x55555555的结果为
所以, i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555的结果为
第二步:计算i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333
(i & 0x33333333) << 2的结果为
(i >>> 2) & 0x33333333的结果为
所以,i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333的结果为
第三步:计算 i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
这里不一步步地计算,同理,直接给出结果,
第四步:计算 i = (i << 24) | ((i & 0xff00) << 8) |((i >>> 8) & 0xff00) | (i >>> 24),
i << 24的结果为
(i & 0xff00) << 8) 的结果为
(i >>> 8) & 0xff00的结果为
(i >>> 24)的结果为
所以,i = (i << 24) | ((i & 0xff00) << 8) |((i >>> 8) & 0xff00) | (i >>> 24)的结果
(2) Integer.reverse(int i):二进制按位反转
原理同上,这里就不详细解释了,代码如下
public static int reverseBytes(int i) {
return ((i >>> 24) ) |
((i >> 8) & 0xFF00) |
((i << 8) & 0xFF0000) |
((i << 24));
}
3.后言
4步法反转二进制数字,你学会了吗?
其他
本人也是在慢慢学习中,如有错误还请原谅、敬请指出,谢谢!
网友评论