Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

For example, given the range [5, 7], you should return 4.

题意:

给出m和n,将m到n之间所有的数字与一遍返回结果(包括m和n)

解题思路:

题目乍一看很简单嘛,循环遍历m到n按位与一遍返回结果就完了啊,但是将这种解法放入LeetCode会发现超时,那么就需要我们去总结规律。

例如题目给出的5,6,7二进制

0101   0110   0111

通过观察我们会发现我们只要看数字的高位即可,后面的数字会相互约掉

再比如

011000  0110001  0110010 0110011

我们发现貌似只要查看所有数字的高k位即可

再比如

01100  01101 01110  01111  10000

我们比较发现如果m和n的位数不相同就会返回0

规律如下:

给出m和n,求出m和n相同的高k位(这里m和n为整型变量,那么按照32位来看待,前面的0也算作高位比较),那么保留高k为其余位置0即为最后结果。

代码如下:

一开始我选择从低位遍历,记录需要舍弃的低l位

代码1

     public int rangeBitwiseAnd(int m, int n) {
if (n == m)
return m;
int h = 0;
int l = 0;
int mm = m;
while (m > 0 || n > 0) {
if ((m & 1) == (n & 1)) {
m >>= 1;
n >>= 1;
++h;
}
else {
m >>= 1;
n >>= 1;
l += h;
++l;
h = 0;
}
}
if(h==0)return 0;
return mm & (0x7fffffff << l);
}

通过后查看代码其实直接从高位开始遍历到第一个不相同的位停下即可找到高k位,代码如下

代码2

     public int rangeBitwiseAnd2(int m, int n) {
if(m==n) return m;
int i;
for(i = 31;i>0;i--){
if((m&(1<<i))!=(n&(1<<i)))
break;
}
return m&(~((1<<i+1)-1));
}

代码简洁了很多,也比原来的快了很多

题目再次利用了Java中的移位操作,记录下做题中遇到的二进制的几个问题:

1.整数x求-x,从二进制角度看是将x按位取反加1

2.左移正负数都是低位补0,右移正数高位补0负数补1,而如果使用Java无符号右移>>>则正负高位都补0

3.将整数按照二进制整个翻转可以利用类似归并排序的分治思想

  (1) 整数32为分成16和16先翻转一下

  (2) 再翻转前16位中的前8位和后8位,再翻转后16位中的前8位和后8位

  。。。以此类推,总共需要Log232 = 5次

代码如下:

     public int reverseBit(int n) {
n = ((n & 0xffff0000) >>> 16) | ((n & 0x0000ffff) << 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;
}

注意这里是将整个32位全部翻转,相当于32位倒过来看。

举例,按照4位来看

1110

(1)将前2位和末2位翻转 10  11

(2)将第一部分对调,第二部分对调得到结果  01 11

Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range的更多相关文章

  1. leetcode 201. Bitwise AND of Numbers Range(位运算,dp)

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  2. LeetCode 201 Bitwise AND of Numbers Range 位运算 难度:0

    https://leetcode.com/problems/bitwise-and-of-numbers-range/ [n,m]区间的合取总值就是n,m对齐后前面一段相同的数位的值 比如 5:101 ...

  3. Java for LeetCode 201 Bitwise AND of Numbers Range

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  4. [LeetCode] 201. Bitwise AND of Numbers Range ☆☆☆(数字范围按位与)

    https://leetcode.com/problems/bitwise-and-of-numbers-range/discuss/56729/Bit-operation-solution(JAVA ...

  5. [LeetCode#201] Bitwise AND of Numbers Range

    Problem: Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of al ...

  6. 【LeetCode】201. Bitwise AND of Numbers Range 解题报告(Python)

    [LeetCode]201. Bitwise AND of Numbers Range 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/prob ...

  7. 【LeetCode】201. Bitwise AND of Numbers Range

    Bitwise AND of Numbers Range  Given a range [m, n] where 0 <= m <= n <= 2147483647, return ...

  8. 【刷题-LeetCode】201 Bitwise AND of Numbers Range

    Bitwise AND of Numbers Range Given a range [m, n] where 0 <= m <= n <= 2147483647, return t ...

  9. Java位运算总结-leetcode题目

    按位操作符只能用于整数基本数据类型中的单个bit中,操作符对应表格: Operator Description & 按位与(12345&1=1,可用于判断整数的奇偶性) | 按位或 ^ ...

随机推荐

  1. 通往全栈工程师的捷径 —— react

    腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...

  2. scrapy 知乎用户信息爬虫

    zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...

  3. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)

    上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...

  4. 修改eclipse皮肤

    习惯了vim黑色背景的程序猿们想必用eclipse时会倍感的不适应吧,不过没关系,因为eclipse的皮肤是可以自己定制的! 下面是我电脑上的eclipse界面,看到这个是不是找回了vim的感觉呢? ...

  5. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  6. EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...

  7. python 数据类型---文件二

    1.打印进度条 import sys,time for i in range(20): sys.stdout.write("#") sys.stdout.flush() #不等缓冲 ...

  8. html中返回上一页的各种写法【转】

    超链接返回上一页代码: <a href="#" onClick="javascript :history.back(-1);">返回上一页</ ...

  9. 安卓GreenDao框架一些进阶用法整理

    大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...

  10. SQL Server 批量删除存储过程

    原理很简单的'drop proc xxx'即可,下面有提供了两种方式来删除存储过程,其实本质是相同的,方法一是生成删除的sql后直接执行了,方法二会生成SQL,但需要检查后执行,个人推荐第二种做法. ...