今天一个小伙伴说在一个算法里面看到代码x&=(x-1)不明白它的意思,于是我给ta分析了一下,在此分享出来,其实也很好理解,想清就行了。

理解x&=(x-1):

  • 单纯的去看这些位运算的话,如果不是接触很多,很难一眼看出它的含义,我们不妨拿几个数先试试,理解一下它的实际运算过程,这样就很好理解了。

    • 假设x=3,也就是11
    • 那么x-1=2,也就是10
    • 那么此时x&(x-1)也就等于11&10,根据&的运算规则,相同为1,不同为0,那么运算结果是10
  • 有了上面这个例子,我们大概知道式怎么计算的了。然后我们再从宏观的角度去理解一下,这里我们就有一个问题了,二进制里面x-1是怎么算的?

    • 假设x二进制位的最后一位是1,那么它减去1后应该是0,变化的只有这一位,那么它再与原来的数相与的话,就是把最后一位由1变成了0。
    • 假设x二进制位的最后一位是0,那么它减1的结果就取决于它的上一位,如果它的上一位还是0,那么还要继续往上找,直到某一位是1为止,减完后,整个数的变化是:这个二进制的最后一个1变成了0,之后的数都变成了1。 那么这个数再与原来那个数相与,变化是:只把最后一个1变成了0。
  • 综上所述,x&=(x-1)的含义是:将 xx 的二进制表示的最后一个 1 变成 0 。

  • 我们也可以利用这个性质统计出某个二进制数里面1的个数,也就是不断的进行x&=(x-1)操作,直到x0为止,其中操作次数就是这个二进制数里面1的个数。

    int count(int x){int res=0;while(x>0){x&=(x-1);res++;}return res;}
  • 这里仅把这个位运算的含义弄清楚,其它的就不多做拓展了。

你知道位运算x=(x-1)表示什么嘛?相关推荐

  1. python中不同进制的整数之间可以直接运算_Python 进制转换、位运算

    一.进制转换 编程用十进制,十进制转换为二进制.八进制.十六进制 In [135]: bin(23) Out[135]: '0b10111' In [136]: oct(23) Out[136]: ' ...

  2. python isodd()判断奇偶_位运算(1的个数;2.判断奇偶)

    1. 1的个数 int NumberOf1(intn){int count = 0;while(n) {++count; n=(n-1)&n; } } 同样一个问题,位运算可以提高程序的运行效 ...

  3. python 整数逆位运算_python训练营:注释、运算符、数据类型与位运算

    天学习的内容整理成脑图如下,其中带☆的是需要重点掌握的模糊知识点,需要加强训练和记忆. 二.具体学习内容 2.1 注释 2.1.1 多行注释 2.1.2 长字符串注释 2.2 运算符 2.2.1 算术 ...

  4. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算

    题目链接:https://www.luogu.org/problem/P1896 题意:n*n的格子填数,每个数填放位置的周围(8个)不能有其他的数 n<=9 ,矩形状压 f[i][j][s], ...

  5. mysql 使用位运算

    如果你不知道什么是位运算的话, 那么请你先去看看基础的C语言教程吧. 与运算 a & b  , 或运算 a | b ,  异或运算 a ^ b , 或者 你也可以将 与运算理解为 + 法  例 ...

  6. 位运算+取某一位+java_Java位运算小节

    2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动. 位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算.位运算符可以分为逻辑运算符(包 ...

  7. 进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)

    我发现网上关于标题上的内容介绍的都很零碎,因此为了方便查找.也为了本人对这一部分的充分理解,就想着写一篇这样的博客(我分成了几个部分,以便查找): 一.进制转换 让我们先来看看各个进制的定义: 十进制 ...

  8. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  9. 技术图文:位运算技术在求解算法题中的应用

    背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第一篇图文. 在总结这篇图文的时候,顺便把遇到的坑写了两篇辅助的图文,大家可以参考一下: 有符号整型的数据范围为什么负数比正数 ...

  10. HDU 4738 Caocao‘s Bridges(桥、任何位运算一定都要加括号、因为有重边所以用前向星)

    HDU 4738 Caocao's Bridges(桥.任何位运算一定都要加括号.因为有重边所以用前向星) Caocao was defeated by Zhuge Liang and Zhou Yu ...

最新文章

  1. 基于C++模板的线性代数库---Eigen
  2. Linux学习中我的10条建议和技巧
  3. linux svn安装和配置
  4. 关于js里的document.compatmode
  5. 位示图 c语言程序,位示图模拟文件系统空闲快管理c语言
  6. @change=“change()“与@change=“change“的区别
  7. JSP 插入到数据库的数据出现 “SQLServerException: 将截断字符串或二进制数据” 错误解决方案
  8. 项目管理杂谈-员工的积极性在哪里?
  9. google map的简单二次开发
  10. 微信小程序引入骨架屏组件
  11. 数据结构上机实践第四周项目4 - 建设双链表算法库
  12. spark textFile方法
  13. 使用python实现微信小程序自动签到
  14. 电子知识|电源管理芯片
  15. 公司 | 四年狂奔,少儿编程准独角兽小码王的盈利逻辑是什么?
  16. CTF MISC(杂项)知识点总结——图片类(一)
  17. 计算机毕业设计Django毕业设计论文源代码服装展示平台电商商城购物系统
  18. java 定义char_JAVA数据类型中的char类型
  19. python读取视频文件大小,码率,帧率,以及通过码率计算文件大小与流量
  20. iOS - Safe iOS 加密安全

热门文章

  1. 文华期货数据格式解析 文华数据格式转换软件
  2. Python脚本实现12306火车票自动抢票回家or旅游
  3. Hello, .NET微软技术广州俱乐部
  4. java 打印指定日期时间段内的每一天
  5. 人工智能教育创新探索
  6. WOW笑话,笑死我了
  7. 计算机柯南纯音乐乐谱,《【Animenz】名侦探柯南 主题曲,钢琴谱》大野克夫(五线谱 钢琴曲 指法)-弹吧|蛐蛐钢琴网...
  8. 《垃圾分类之泉师保卫战》游戏介绍
  9. 蓝桥杯 真题 2021 4、路径
  10. Three.js教程:三维坐标系