【与二进制中最低位】相关的位运算小技巧

【与二进制中最低位】相关的位运算小技巧

说明:

  1. 此文章中的n都为正数
  2. 假设n的二进制位是 (a10…0)2,其中a表示若干个高位,1 表示最低位的 1,0⋯0 表示后面的若干个 0。

通过位运算技巧可以更快速的求得:

  • n的二进制中最低位的1
  • n的二进制中1的个数
  • n是否是2的幂

总结

位运算 高位 最低位的1以及低位
n a 10…0
n - 1 a 01…1
n & (n-1) a 00…0
-n ~a 10…0
n & (-n) 0 10…0

n&(n-1)

通过n&(n-1)可以将n的二进制中最低位的1变为0,即将最低位的1移除。

n的二进制表示为: (a10…0)2

n-1的二进制表示为:*(a01…1)2*

n&n-1得到的结果为: *(a00…0)2*,即高位 a 不变,在a之后的所有位都会变为 0,这样最低位的1就被移除了。

n&-n

通过n&(-n)可以直接获取 n 的二进制表示的最低位的 1

n的二进制表示为: (a10…0)2

-n是n的相反数,是一个负数,二进制表示为:*(~a 10…0)2*
由于负数是按照补码规则在计算机中存储的,-n 的二进制表示为 n 的二进制表示的每一位取反再加上 1
所以-n的二进制表示为 (~a 01…1)2 + (1)2 = (~a 10…0)2
其中,~a 是 a 的按位取反*(a & ~a)2 = 0*

则n&-n得到的结果为: *(0…1…0)2*,高位全部变为 0,最低位的 1 以及之后的所有 0 不变,这样就获取了 n 的二进制中表示的最低位的 1。


参考:https://leetcode-cn.com/problems/power-of-two/solution/2de-mi-by-leetcode-solution-rny3/


上一篇
尝试在hexo上进行latex渲染遇到的坑 尝试在hexo上进行latex渲染遇到的坑
尝试在hexo上进行latex渲染遇到的坑自顺利在hexo上安装插件渲染出思维导图后,我有点飘了,正好遇到在写文章时遇到一个地方要写上下标,于是就在想,能不能在hexo上渲染出latex呢? 在查阅了一些文章后,我信心满满的按照教程开始了安
2021-05-30
下一篇
修改博客图片的方法 修改博客图片的方法
修改博客图片的方法博客上的图片分为两种: banner图片 文章预览上面的图片 banner图片 将图片存储到/themes/hexo-theme-matery/source/medias/banner下面 在/themes/hexo-
2021-05-10
目录