n & (n - 1)的用途

最近在刷位运算的算法题的时候,发现了不少的题都可以用到 n & (n - 1)这个来计算结果。分享一下。

1.特点:

首先,以 n = 6 为例,我们进行计算,

6 & (6 - 1) = 6 & 5 = 4

二进制表示为:

(110) & (101) = (100)

可以看到 十进制中最后的结果从6变为4,好像没啥有用的信息。那么我们再看看二进制中,可以发现从(110)变为(100),这时我们可以看到最低位的1变为了0.

以上,我们可以得出结论 n & (n - 1) 的结果会导致n的最低位的1变为0.

2.作用:

那么,这个规律有什么用呢?

2.1. 位1的个数

现在我们可以考虑,如果我们需要判断一个二进制数中位1的个数,可否用上面的算式。

其实,我们不断让当前的 n 与 n - 1做与运算,直到 n 变为 0即可。因为每次运算会使得 n 的最低位的 1 被翻转,因此运算次数就等于 n 的二进制位中 1 的个数。

代码如下:

public int hammingWeight(int n) {int count = 0;while(n != 0){n &= n - 1;count++;}return count;
}

2.2. 数是否为2的幂

又或者我们可以考虑,如果我们需要判断一个数是否为2的幂,可否用上面的算式。

首先2的幂数 有一个特点就是在二进制表示形式中,只有一位为1,例如 4 = (100), 8 = (1000)

那么2的幂 - 1 在二进制表示形式中就是全部位都为1的数,且比2的幂 少一位,例如 3 = (11), 7 = (111)

那么两者相与,即 (2的幂 & (2的幂 - 1)) = 0,例如 4 & 3 = 0, 8 & 7 = 0

结论:如果一个数n,使得n & (n - 1) = 0,那么n为2的幂。

代码如下:

public boolean isPowerOfTwo(int n) {return n > 0 && (n & (n - 1)) == 0;
}

n (n - 1)的用途相关推荐

  1. Java的反射作用_浅析Java 反射机制的用途和缺点

    反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...

  2. typedef的四个用途和两大陷阱

    typedef的四个用途和两个陷阱 --------------------------------- 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如: c ...

  3. android怎么监听多点触摸_什么是多点触控技术,有哪些用途

    自从乔布斯将触控技术用于苹果手机上,很多的手机厂商纷纷效仿,触控技术几乎成为手机的"标配".其实,触控技术早就存在,只是一直未能大面积用于各种设备中,本文将带您认识神奇的触控技术. ...

  4. 网络新手ip隐藏器_动态IP代理的用途

    在如今互联网迅速发展的时代,我们的生活几乎离不开网络,而且网络也逐渐成为了大家赖以生存的工作.如何更好地运用网络已然成为了很多人的工作重心.对于互联网行业工作者来说,对于动态IP代理已经很普遍,但是我 ...

  5. 中key的用途_Micro Focus Operations Bridge Manager中的多个(RCE)漏洞

    从供应商的网站上. OBM作为操作桥为您的IT操作提供了一个单一的控制中心.所有来自服务器.网络.应用程序.存储和基础设施中其他IT孤岛的事件和性能管理数据都会被整合到一个先进的中央事件控制台的单一事 ...

  6. Javascript闭包和闭包的几种写法及用途

    好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途.  一.什么 ...

  7. android之android.intent.category.DEFAULT的用途和使用

    1.要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent. Explicit Intent明确的指定了要启动的Acitivity , ...

  8. using的几种用途

    using 常用来引用命名空间 1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 using System.C ...

  9. (6)解构赋值的用途

    解构赋值的用途 1.交换变量的值 var a = 100; var b = 200; var t; t = a; a = b; b = t; //解构赋值的写法完成[ES6交换变量的值] var x ...

  10. 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途...

    原文网址:http://blog.csdn.net/weasleyqi/article/details/8090373 iOS视图控制对象生命周期-init.viewDidLoad.viewWillA ...

最新文章

  1. 使用Tensorize评估硬件内部特性
  2. 宝塔建站 mysql在哪_宝塔面板建站教程,越详细越好纯小白! - 搜外问答
  3. Jetty 9.0.0 首个里程碑出现
  4. 进入公司前与Boss的会谈话
  5. C语言的编译器常见的有哪些?
  6. python的scrapy框架的安装_Python3环境安装Scrapy爬虫框架过程及常见错误
  7. hms能适配鸿蒙吗,国产手机即将抱团?魅族率先使用HMS服务,或多家国产适配鸿蒙!...
  8. Android Lambda 表达式使用实例,-
  9. 全新SpringBoot整合Elasticsearch6.xxx搜索引擎实战
  10. redis怎么修改_面试官问我Redis事务,还问我有哪些实现方式
  11. 【数据结构笔记30】拓扑排序、AOV网络、AOE网络、关键工序
  12. Java菜鸟教程 一些简单的练习
  13. ebs日记账向导Excel版本选择
  14. python使用Jpype调用java程序
  15. 英语听力计算机教室,每日英语听力电脑版|每日英语听力 v9.2.0 PC客户端
  16. php如何替换ico图标,wordpress网站怎么设置更换站点favicon ico图标
  17. 如何将BMP文件转换为JPG文件
  18. 解决Office安装错误代码1024:安装程序无法打开注册表项UNKNOWN\Components\
  19. 测试开发3年,我决定去读个名校硕士
  20. [蓝桥杯2019初赛]立方和

热门文章

  1. 非常有用的一个正则表达式.匹配多个任意字符
  2. 内网穿透-端口映射-跨域问题解决
  3. 插值与拟合 (二) : 曲线拟合的线性最小二乘法
  4. linux7 inittab没有,CentOs7 7个运行级别介绍,(CentOs7 inittab在使用systemd时不再使用)...
  5. in-place运算总结
  6. laravel学习1.0
  7. win7美化_极致美化 | 我们如何把 Windows「改造」成 mac OS
  8. GlobalWoZ: 面向全球通用的人机对话系统——快速构建多语对话能力初探
  9. const T、const T*、T *const、const T、const T* 的区别
  10. 高并发下数据库分库分表面试题整理