Reverse bits of a given 32 bits unsigned integer.

Example 1:

Input: 00000010100101000001111010011100
Output: 00111001011110000010100101000000
Explanation: The input binary string 00000010100101000001111010011100 represents the unsigned integer 43261596, so return 964176192 which its binary representation is 00111001011110000010100101000000.

Example 2:

Input: 11111111111111111111111111111101
Output: 10111111111111111111111111111111
Explanation: The input binary string 11111111111111111111111111111101 represents the unsigned integer 4294967293, so return 3221225471 which its binary representation is 10101111110010110010011101101001.

Note:

  • Note that in some languages such as Java, there is no unsigned integer type. In this case, both input and output will be given as signed integer type and should not affect your implementation, as the internal binary representation of the integer is the same whether it is signed or unsigned.
  • In Java, the compiler represents the signed integers using 2's complement notation. Therefore, in Example 2 above the input represents the signed integer -3 and the output represents the signed integer -1073741825.

Follow up:

If this function is called many times, how would you optimize it?

 

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

这道题又是在考察位操作 Bit Operation,LeetCode 中有关位操作的题也有不少,比如 Repeated DNA SequencesSingle Number,  Single Number II ,和Grey Code 等等。跟上面那些题比起来,这道题简直不能再简单了,我们只需要把要翻转的数从右向左一位位的取出来,如果取出来的是1,将结果 res 左移一位并且加上1;如果取出来的是0,将结果 res 左移一位,然后将n右移一位即可,参见代码如下:

解法一:

class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
if (n & == ) {
res = (res << ) + ;
} else {
res = res << ;
}
n = n >> ;
}
return res;
}
};

我们可以简化上面的代码,去掉 if...else... 结构,可以结果 res 左移一位,然后再判断n的最低位是否为1,是的话那么结果 res 加上1,然后将n右移一位即可,代码如下:

解法二:

class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
res <<= ;
if ((n & ) == ) ++res;
n >>= ;
}
return res;
}
};

我们继续简化上面的解法,将 if 判断句直接揉进去,通过 ‘或’ 上一个n的最低位即可,用n ‘与’ 1提取最低位,然后将n右移一位即可,代码如下:

解法三:

class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
res = (res << ) | (n & );
n >>= ;
}
return res;
}
};

博主还能进一步简化,这里不更新n的值,而是直接将n右移i位,然后通过 ‘与’ 1来提取出该位,加到左移一位后的结果 res 中即可,参加代码如下:

解法四:

class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
res = (res << ) + (n >> i & );
}
return res;
}
};

我们也可以换一种角度来做,首先将n右移i位,然后通过 ‘与’ 1来提取出该位,然后将其左移 (32 - i) 位,然后 ‘或’ 上结果 res,就是其颠倒后应该在的位置,参见代码如下:

解法五:

class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
res |= ((n >> i) & ) << ( - i);
}
return res;
}
};

讨论:这道题的最高票解法实在是很叼啊,参见这个帖子,但是博主没有太理解啊,希望哪位大神能讲解一下哈~

Github 同步地址:

https://github.com/grandyang/leetcode/issues/190

类似题目:

Number of 1 Bits

Reverse Integer

参考资料:

https://leetcode.com/problems/reverse-bits/

https://leetcode.com/problems/reverse-bits/discuss/54938/A-short-simple-Java-solution

https://leetcode.com/problems/reverse-bits/discuss/54772/The-concise-C++-solution(9ms)

https://leetcode.com/problems/reverse-bits/discuss/54741/O(1)-bit-operation-C++-solution-(8ms)

https://leetcode.com/problems/reverse-bits/discuss/54738/Sharing-my-2ms-Java-Solution-with-Explanation

https://leetcode.com/problems/reverse-bits/discuss/54873/Java-two-methods-using-String-or-bit-operation-6ms-and-2ms-easy-understand

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Reverse Bits 翻转位的更多相关文章

  1. 2016.5.16——leetcode:Reverse Bits(超详细讲解)

    leetcode:Reverse Bits 本题目收获 移位(<<  >>), 或(|),与(&)计算的妙用 题目: Reverse bits of a given 3 ...

  2. [leetcode] Reverse Bits

    Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (re ...

  3. leetcode reverse bits python

    Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (re ...

  4. LeetCode Reverse Bits 反置位值

    题意:给定一个无符号32位整数,将其二进制形式左右反置,再以整型返回. 思路:循环32轮,将n往右挤出一位就补到ans的尾巴上. class Solution { public: uint32_t r ...

  5. [LeetCode] Reverse Bits 位操作

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  6. lc面试准备:Reverse Bits

    1 题目 Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represente ...

  7. LeetCode 190. Reverse Bits (反转位)

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  8. 【一天一道Leetcode】#190.Reverse Bits

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 我的个人博客已创建,欢迎大家持续关注! 一天一道le ...

  9. [LeetCode] 190. Reverse Bits 颠倒二进制位

    Reverse bits of a given 32 bits unsigned integer. Example 1: Input: 00000010100101000001111010011100 ...

随机推荐

  1. DotLiquid模板引擎简介

    DotLiquid是一个在.Net Framework上运行的模板引擎,采用Ruby的Liquid语法,这个语法广泛的用在Ruby on rails和Django等网页框架中. DotLiquid相比 ...

  2. NSSortDescriptor 的使用

    NSSortDescriptor  是什么 ? 你可以将它看做是对一个排序规则的描述者  因为我们可以使用它来对我们数组中的对象进行排序操作 假设现在有这样一个需求: 数组里面有十个Person对象 ...

  3. 详解web容器 - Jetty与Tomcat孰强孰弱

    Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器.它有一个基本数据模型,这个数据模型就是 Handler(处理器 ...

  4. 利用rebase来压缩多次提交

    我们可以用Git merge –squash来将分支中多次提交合并到master后,只保留一次提交历史.但是有些提交到github远程仓库中的commit信息如何合并呢? 历史记录 首先我们查看一下m ...

  5. web设计页面跳转的方法

    一.asp.net c# 打开新页面或页面跳转 1. 最常用的页面跳转(原窗口被替代):Response.Redirect("newpage.aspx"); 2. 利用url地址打 ...

  6. 学习Redis你必须了解的数据结构——JS实现集合和ECMA6集合

    集合类似于数组,但是集合中的元素是唯一的,没有重复值的.就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算.在ECMA6之前,JavaScript没有提供原生的Set类,所以只能 ...

  7. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  8. Java编程里的类和对象

    像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...

  9. js通过循环多张图片实现动画效果

    以小鱼摇尾巴和眨眼睛为例 动画思路: 1.将图片资源放在数组里面 2.通过计时器来设定间隔时间 3.通过计数器来取相应的图片 第一步:基本框架,鱼身体 <body> <canvas ...

  10. 纯css实现qqlogo图

    <!doctype html> <html> <head> <title>CSS3logo</title> <style type=& ...