题目的链接在这里:https://leetcode-cn.com/problems/reverse-bits/
题目大意
颠倒给定的 32 位无符号整数的二进制位。提示:
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。
进阶:
如果多次调用这个函数,你将如何优化你的算法?
一、示意图
二、解题思路
位运算
错误方法
代码如下:
public static int reverseBits(int n) {
// 就是 输入 1001 输出 1001 输入1011 输出 1101
//输入长度必须是 32位的 但是会发现太长了
String s=(String.valueOf(n));
StringBuilder sb=new StringBuilder(s);
s=sb.reverse().toString();
//System.out.println(s);
return Integer.valueOf(s);
}
参考网上
代码如下:
public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
//参考网上的思路 把n作为一个32的二进制串 从低位往高位枚举n的每一位 将其倒叙添加到翻转结果中
int rev=0;
for(int i=0;i<32;++i){
//二进制最后一位bit
//我的理解是 1 是00000...01 所以和n结合就是最后一个
int bit=n&1;
//相当于取出来之后 右移一位
n=n>>1;
//然后把结果左移一位 把bit加入进去
rev=(rev<<1)+bit;
}
return rev;
}
}