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. .Net Core MVC 网站开发(Ninesky) 2.4、添加栏目与异步方法

    在2.3中完成依赖注入后,这次主要实现栏目的添加功能.按照前面思路栏目有三种类型,常规栏目即可以添加子栏目也可以选择是否添加内容,内容又可以分文章或其他类型,所以还要添加一个模块功能.这次主要实现栏目 ...

  2. Linux中进行单文件内容的复制

    文件内容复制的常规方法: 开辟一段空间,不断读取文件的内容并写入另一文件当中,这种方法好在安全,一般在类型允许的最大范围内是安全的,缺点就是复制内容的时间长 一次性复制文件的内容,这种方法必须首先获取 ...

  3. Javascript面向对象类文章目录

    1.javaScript的原型继承与多态性 2.JavaScript的继承实现方式 3.JS中 call() 与apply 方法

  4. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  5. WebGIS中等值面展示的相关方案简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值面是气象.环保等相关项目上常用到的效果展示.在传统的CS项 ...

  6. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  7. JavaScript基础知识总结(一)

    当我们接触一种新语言时,首先要先了解它,对它有一定的理论认识. 那么,什么是JavaScript呢? JavaScript是一种脚本语言,由web浏览器进行解释和执行.它包括ECMAScript.DO ...

  8. 微信小程序前端源码逻辑和工作流

    看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.j ...

  9. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  10. CSS3新特性应用之结构与布局

    一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...