题解 | #牛群的编码反转#
牛群的编码反转
https://www.nowcoder.com/practice/fbbef1b8d84b45a49f95ebf63a3b353b
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return int整型 */ public int reverseBits (int n) { // write code here n = (n >>> 16) | (n << 16); // 交换每16位 n = ((n & 0xFF00FF00) >>> 8) | ((n & 0x00FF00FF) << 8); // 交换每8位 n = ((n & 0xF0F0F0F0) >>> 4) | ((n & 0x0F0F0F0F) << 4); // 交换每4位 n = ((n & 0xCCCCCCCC) >>> 2) | ((n & 0x33333333) << 2); // 交换每2位 n = ((n & 0xAAAAAAAA) >>> 1) | ((n & 0x55555555) << 1); // 交换每1位 return n; } }
Java代码,这道题用了位掩码写的,嘿嘿,这样看起来时间复杂度会很低,但是不是正常结题答案,反正那么多答案了,我就写一个不一样的。
这个题目涵盖了以下几个知识点:
- 位运算、位掩码
- 位操作技巧
- 分治法,逐步缩小范围
代码的文字解释如下:
- 使用右移和左移操作来交换每16位的位置。
- 使用位掩码
0xFF00FF00
和位运算,分别交换每8位、每4位、每2位和每1位的位置。 - 最后,返回反转后的二进制编码
n
。