n&(n-1)的用途
最近做LeetCode上面的题目,发现很多题目都用到了n&(n-1)。感觉真是神通广大,下面就目前所看到的一些用途总结一下:
1,求一个int类型数是否为2的幂
当n=4时,二进制为:0100
n-1=3,二进制为:0011
则:n&(n-1)==0
当n=8时,为1000
n-1=7,为0111
则n&(n-1)==0
再举个反例:当n=5,为0101
n-1为0100
则n&(n-1)=0100=4!=0
从上面我们可以看出,凡是2的幂,均是二进制数的某一高位为1,且仅此高位为1,比如4,0100;8,1000。那么它的n-1就变成了1所处的高位变成0,剩余低位变成1,如4-1,0011,8-1,0111,那么n&(n-1)必为0
也就是n&(n-1)==0
2,一个数的二进制中有多少位为1
while(n>0){
count++;
n = n&(n-1);
}
这个原理有点类似于2的幂,大家可以自己动手试试,文字的解释永远无法战胜自己的亲身实践
3,一个数是否为4的幂
一个数是4的幂,那么必然是2的幂,反之,则不然
那么首先确定条件n&(n-1)==0,确定出该数是否为2的幂,这就找到了一项必要条件
刚才说了一个数是2的幂却不一定是4的幂,比如2,8,32等这些都是2的级数次方
但是,我们可以发现,2的偶数次方,比如2^0=1,2^2=4,2^4=16,这些数减去1,都能被3整除,而2的奇数次方的数减去1之后无法被3整除,不信可以试试
这样的话,我们就可以很容易找到4的幂的充要条件,即 n>0 && ((n&(n-1))==0) && ((n-1)%3==0)
4,接下来还有一些可以用到符号&运算的例子,比如求一个数32位二进制的倒序
int result =0;
for(int i=0;i<32;i++){
result<<=1;//result先左移一位,低位补0
result = result+(n&1);
n>>=1;//n右移一位,高位补0
}
5,将一个数表示为16进制,并返回相应字符串
if(n==0) return "0";
String result ="";
String[] map={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
while(n!=0){
result = map[n&15]+result;
n>>=4;
}
好了,暂时就这么多,以后遇到了再补上。
n&(n-1)的用途的更多相关文章
- 【.net深呼吸】(WCF)OperationContextScope 的用途
一个WCF服务可以实现多个服务协定(服务协定实为接口),不过,每个终结点只能与一个服务协定关联,并指定调用的唯一地址.那么,binding是干吗的?binding是负责描述通信的协议,以及消息是否加密 ...
- Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...
- 【Java之对象清理】finalize()的用途
Java允许在类中定义一个名为finalize()的方法.它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法.并且在下一次垃圾回收动作发生时,才会真正回收 ...
- Microsoft Visual Studio 文件识别及其用途简述
Microsoft Visual Studio IDE开发工具集,目前已推出多个不同版本,从之前的VC4.0到现在的VS2015,各个版本都会或多或少的功能或性能上的修改.提升,具体的改进地方可去官网 ...
- Atitit图像处理的用途
Atitit图像处理的用途 1.1. 分类识别 (人脸检测,肤色识别,人类检测:1 1.2. 炫丽的动态按钮生成:色相旋转+自己的草书等图片合成,图片自动裁剪1 1.3. 集成调用自绘gui接口:识别 ...
- android Bundle savedInstanceState用途
经常会出现用户按到home键,退出了界面,或者安卓系统意外回收了应用的进程,这种情况下,使用Bundle savedInstanceState就可以用户再次打开应用的时候恢复的原来的状态 (以下转自: ...
- 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;
http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html 1. char.varchar.nvarchar之间的区别(包括用途和空间占用) ...
- 揭秘 typedef四用途与两陷阱[转]
自 http://niehan.blog.techweb.com.cn/archives/325.html typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产 ...
- 全面理解Javascript闭包和闭包的几种写法及用途
好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途. 一.什么 ...
- Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途
Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途 1.1. 高斯模糊 的原理(周边像素的平均值+正态分布的权重1 1.2. 高斯模糊 的用途(磨皮,毛玻璃效果,背景虚化 ...
随机推荐
- 关于IE兼容的问题
以下内容,均来自不同的网站,非本人原创,只是收集一下放在一起! =============================== [一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 ...
- FreeMusic项目优化(一)——flex布局学习记录
参考博客:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html flex布局是w3c于09年提出的,用于简便,整洁,响应式地解决布局问题的手 ...
- (转载)最近总是遇到各种 IEbug,mark一下,学习到了,转载出处:http://www.cnblogs.com/ruomeng/p/5332814.html
本文分享下我在项目中积累的IE8+兼容性问题的解决方法.根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK ...
- ls参数
-a 全部文件 -A 与a差不多,但是不包括.和..开头的两个目录 -d 仅列出目录 -f 直接列出结果,不进行排序 -h 列出文件大小 -i 列出inode的位置,而非列出文件属性 -l 列出长数据 ...
- 安装Pywin32后无法正常引用pyd文件
1. 首先在官方下载pywin32 2.下载完成后,无法正常引用pyd文件 3.解决方案: python安装目录\Lib\site-packages\pywin32_system32\* 至 C:\W ...
- 初习mysql procedure
1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户 ...
- 悦读FM客户端应用源码
<ignore_js_op> <ignore_js_op><ignore_js_op> 正如悦读FM所表达的[当好的文字遇上好的声音],悦读FM提供了一个很好的文章 ...
- HDU 4347 The Closest M Points (kdTree)
赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...
- (四)VMware Harbor 配置文件
VMware Harbor 配置文件 :harbor.yml # Configuration file of Harbor # The IP address or hostname to access ...
- 【转】Python 访问 HDFS
1.前言 hdfs , Hadoop Distributed File System.Hadoop的分布式文件系统,安全行和扩展性没得说. 访问HDFS的方式有以下几种: 命令行方式:FS Shell ...