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. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. Vagrant 基础全面解析

    这篇 Vagrant 入门文章将带你创建一个 Vagrant 项目,这个过程将会用到 Vagrant 所提供的主要基本特性.如果想了解 Vagrant 能为你带来哪些好处,可以阅读 Vagrant 官 ...

  3. 旺财速啃H5框架之Bootstrap(五)

    在上一篇<<旺财速啃H5框架之Bootstrap(四)>>做了基本的框架,<<旺财速啃H5框架之Bootstrap(二)>>篇里也大体认识了bootst ...

  4. ASP.NET Web API 跨域访问(CORS)

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  5. Word/Excel 在线预览

    前言 近日项目中做到一个功能,需要上传附件后能够在线预览.之前也没做过这类似的,于是乎就查找了相关资料,.net实现Office文件预览大概有这几种方式: ① 使用Microsoft的Office组件 ...

  6. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  7. .NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍

    1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过 ...

  8. 通过 floating IP 访问 VIP - 每天5分钟玩转 OpenStack(126)

    前面我们是直接用 curl 测试 VIP,在更为真实的场景中通常会使用 floating IP 访问 VIP. 下面我们给 VIP 关联一个 floating IP,再进行测试. 访问 Project ...

  9. 获取微软原版“Windows 10 推送器(GWX)” 卸载工具

    背景: 随着Windows 10 免费更新的结束,针对之前提供推送通知的工具(以下简称GWX)来说使命已经结束,假设您还未将Windows 8.1 和Windows 7 更新到Windows 10 的 ...

  10. 注释生成Api文档

    1.开发背景 最近一直在写dubbo接口,以前总是用word文档写接口描述然后发给别人.现在太多了,而且跟别人对接联调的人家急着用,根本没时间去写word文档.那就想想怎么用doc文档注释自动生成接口 ...