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;

}

好了,暂时就这么多,以后遇到了再补上。

时间: 2024-08-05 21:48:53

n&(n-1)的用途的相关文章

JQuery的用途和功能

jQuery库为Web脚本编程提供了通用的抽象层,使得它几乎适用于任何编程的情形.由天它容易扩展而且不断有新插件面世增强它的功能,所以这里无法涵盖它所有可能的用途和功能.抛开这些就其核心特性而言,jQuery能够满足下列需求:    一.取得页面中的元素. 如果不使用JavaScript库,遍历DOM树,以及查找HTML文档结构中某个特殊的部分,必需编写很多代码.jQuery为准确获取需要操纵的文档元素,提供了可靠而富有效率的选择符机制.    二.修改页面的外观. CSS虽然为呈现方式提供了一

解读Mirantis Fuel部署OpenStack各个网络的用途和分析

首先得说一声不好意思,之前的环境破坏了,一直没有机器进行测试,所以之前的文章到第三篇就结束了一直没找到时间和环境继续测试,这里就简单说说Fuel的网络. 部署OpenStack最复杂的应该算是网络部分了,Fuel简化部署OpenStack的同时网络类型对于新手来说也是费解,接下来我简单说一下我的理解. 下图是我们使用Fuel部署的时候遇到的几个网络类型,此时使用neutron vlan模式部署. 我们总结下,大致是五个网络: 1.PXE(部署网络):这是部署网络,也就是在节点开机的时候设置的网络

ISIS的OL过载机制新用途

1.OL过载机制的特性 在同一个区域中,所有ISIS路由器的LS数据库要求要完全一致,只有这样才能实现,各个路由器上计算出来的这颗最短路径树完全一样(只是各个路由器节点处于树中的位置不同而已). 如果区域中某台路由器用于储存LS数据库的内存被消耗殆尽,那么就意味着该ISIS路由器将无法攒齐本区域内所有的LSP.那么在进行SPF计算的时候必然会出现问题.当出现这种情况的时候,其他ISIS路由器在计算最短路径树时,应该将这台路由器视为最短路径树中的某个"叶节点"路由器,而不应该将其视为某个

C++的 RTTI 观念和用途(非常详细)

自从1993年Bjarne Stroustrup [注1 ]提出有关C++ 的RTTI功能之建议﹐以及C++的异常处理(exception handling)需要RTTI:最近新推出的C++ 或多或少已提供RTTI. 然而,若不小心使用RTTI,可能会导致软件弹性的降低.本文将介绍RTTI的观念和近况﹐并说明如何善用它. 什么是RTTI﹖      在C++ 环境中﹐头文件(header file) 含有类之定义(class definition)亦即包含有关类的结构资料(representat

content属性的4种用途

content属性浏览器支持情况,兼容到IE8浏览器,IE7及以下不支持 用途一.配合:before及:after伪元素插入文本 <div>     <p>伪元素</p> </div> p:before{     content:'CSS3';     color:#4bb;     font-weight:bold;     margin-right:20px;     background:#f0f0f0;     /*如果要设置宽高的话,就必须变成块级

Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

iOS 生命周期 -init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 区别和用途

iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewCont

全面理解Javascript闭包和闭包的几种写法及用途

一.什么是闭包和闭包的几种写法和用法                                                       1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态. 2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 简单的说,Javascript允许使用内部函数---即函数定义和函数表

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

转载(http://blog.csdn.net/jason0539/article/details/10049899) 1.要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent. Explicit Intent明确的指定了要启动的Acitivity ,比如以下Java代码: Intent intent= new Intent(this, B.class): Implicit Intent没有明确的指定要启动哪个Activity

Vmware虚拟机三种网络模式用途

为了更深层次的对Vmware虚拟机三种网络模式的理解,http://www.3lian.com/edu/2012/03-29/24049.htm 在网上查一些资料,通过对资料的理解,将此总结如下. 1.Bridged模式 在这种模式下,虚拟网卡和物理网卡同在一个IP网段,能够互相通信,并且能够浏览外网(前提是物理网卡能够浏览外网).它用的是Vmnet 0网络,在这里Vmnet 0网络充当了虚拟交换机的用途. 2.Host Only模式 在这种模式下,虚拟网卡只能和物理网卡进行通信,不能够浏览外网