颠倒二进制位
作者:互联网
引言
力扣题目【颠倒二进制位】描述 -> 传送门
所用语言:Java
执行用时 1 ms,内存消耗 37.8 MB
正文
题目描述很简单,把一个数的二进制位做一个镜像对称,即颠倒过来。例如:
0001101 -> 1011000
感觉也没啥好解释的,直接先看代码吧,这样更直观一点
答案
public int reverseBits(int n) {
// 如果所有位全都是1或全都是0,可以直接返回
if (~n == 0 || n == 0) {
return n;
}
int result = 0;
for (int i = 0; i < 32; i++) { // 正确的循环条件
// while (n != 0) { // 错误的循环条件
if (n % 2 == 0) {
// 此时n的最低位是0
result = result << 1;
} else {
// 此时n的最低为是1
result = (result << 1) + 1;
}
// n无符号右移一位,覆盖掉最低位
n = n >>> 1;
}
return result;
}
解释一下我的思路:
- 如果所有位全都是1或全都是0,就不用做处理,可以直接返回
- 否则,定义一个数
result
,进入循环。每次循环,得到当前的n
的最低位的二进制位,然后将这个二进制位补到result
的最低位。这样循环结束之后,原来的n
的低位就变成了result
的高位,原来的n
的高位就变成了result
的低位 - 所以,每次循环,
result
都要左移,以空出最低位来接收;n
都要右移,以覆盖掉最低位 - 但是,不能使用
while (n != 0)
做为循环条件。举个例子,现在只要求输入4位二进制位的数,并将其二进制位颠倒。如果输入0011
,正确输出应该是1100
[表示12]。可是如果以使用while (n != 0)
做为循环条件,实际的输出却是11
[表示3]
最后
声明一下,力扣中相同的代码每次提交的内存消耗是有波动的,我的这个答案最低的内存消耗是 37.8 MB(试了三次)
还有,记得在 Java 中移位运算的优先级比加、减运算的低
最后,我觉得这个颠倒二进制位应该、可能、或许会有直接的数学公式,但是我想不出。如果各位有更好的解题办法,希望能分享一下
标签:二进制位,最低,颠倒,int,循环,result 来源: https://blog.csdn.net/qi_ming_hao_nan/article/details/115307728