You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
2.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package class32;
public class Problem_0190_ReverseBits {
// 代码看着很魔幻吧?
// 给个例子假设n二进制为
// 1011 0111 0011 1001 0011 1111 0110 1010
// 解释一下第一行是把n左边16位和n右边16位交换
// n = (n >>> 16) | (n << 16);
// 因为 n >>> 16 就是左边16位被移动到了右侧
// 同时 n << 16 就是右边16位被移动到了左侧
// 又 | 在了一起所以n变成了
// 0011 1111 0110 1010 1011 0111 0011 1001
// 第二行,
// n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8);
// (n & 0xff00ff00)
// 这一句意思是左侧开始算0~7位保留8~15位全变016~23位保留24~31位全变0
// 0011 1111 0000 0000 1011 0111 0000 0000
// (n & 0xff00ff00) >>> 8 这句就是上面的值统一向右移动8位变成
// 0000 0000 0011 1111 0000 0000 1011 0111
//
//
// (n & 0x00ff00ff)
// 这一句意思是左侧开始算0~7位全变08~15位保留16~23位全变024~31位保留
// 0000 0000 0110 1010 0000 0000 0011 1001
// (n & 0x00ff00ff) << 8 这句就是上面的值统一向左移动8位变成
// 0110 1010 0000 0000 0011 1001 0000 0000
// 那么 ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8)
// 什么效果就是n的0~7位和8~15位交换了16~23位和24~31位交换了
// 0110 1010 0011 1111 0011 1001 1011 0111
// 也就是说整个过程是n的左16位和右16位交换
// n的左16位的内部左8位和右8位交换n的右16位的内部左8位和右8位交换
// 接下来的一行其实是从左边开始算0~7位内部左4和右4交换8~15位左4和右4交换...
// 接下来的一行其实是从左边开始算0~3位内部左2和右2交换4~7位左2和右2交换...
// 最后的一行其实是从左边开始算0~1位内部左1和右1交换2~3位左1和右1交换...
public static int reverseBits(int n) {
// n的高16位和n的低16位交换
n = (n >>> 16) | (n << 16);
n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8);
n = ((n & 0xf0f0f0f0) >>> 4) | ((n & 0x0f0f0f0f) << 4);
n = ((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2);
n = ((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1);
return n;
}
}