位运算符n&(n-1)详解与妙用
用处一:求一个int类型数是否为2的幂
1、当n=4时,二进制为:0100
n-1=3,二进制为:0011
则:n&(n-1)==0 解释(将0100最右边的1变为0 则 0000=0)
2、当n=8时,为1000
n-1=7,为0111
则n&(n-1)==0
3、当n=5,为0101
n-1为0100
则n&(n-1)=0100=4!=0 解释(将0101最右边的1变为0 则 0100=4)
从上面我们可以看出,凡是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
用处二:一个数的二进制中有多少位为1
function findNumberOf1(num) {
var count = 0;
var n = num;
while(n!==0) {
count++;
n = (n-1)&n
console.log('count',count)
console.log('n',n)
}
console.log(count)
}
findNumberOf1(7)// 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)
用处四:接下来还有一些可以用到符号&运算的例子,比如求一个数32位二进制的倒序
int result =0;
for(int i=0;i<32;i++){
result<<=1;//result先左移一位,低位补0
result = result+(n&1);
n>>=1;//n右移一位,高位补0
}
用处五:将一个数表示为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)详解与妙用的更多相关文章
- 基本运算符与if while详解:
''' 基本运算符与if while详解: ''' # 算术运算符 # + - * / % // ** # 返回一个数值 # 比较运算符 # > >= < <= == != # ...
- [java基础] 002 - 位运算符的详解和妙用
一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...
- java运算符的优先级和详解
优先级 符号 名称 结合性(与操作数) 目数 说明 1 . 点 从左到右 双目 ( ) 圆括号 从左到右 [ ] 方括号 从左到右 2 + 正号 从右到左 单目 - 负号 从右到左 单目 ++ ...
- Twitter-Snowflake,64位自增ID算法详解
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...
- php 运算符and or && || 的详解
想弄清这个问题,首先要了解这些运算符的优先级:了解后,我们才知道,逻辑运算和赋值运算的执行顺序: //and or 的优先级小于 = //&& || 的优先级大于 = //or-前面语 ...
- windows 64位下,React-Native环境搭建详解 (Android)
React-Native环境搭建需要: 1.安装Java JDK 2.安装Android Studio 3.安装node.js 4.安装git 5.安装Python 2.x (注意目前不支持Pytho ...
- 【转】Twitter-Snowflake,64位自增ID算法详解
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...
- java中位运算和移位运算详解
一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 ...
- C++ new new[]详解
精髓: operator new()完成的操作一般只是分配内存:而构造函数的调用(如果需要)是在new运算符中完成的. operator new和new 运算符是不同的,operator new只分配 ...
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面 ...
随机推荐
- Jmeter前置处理器和后置处理器的使用
一.JMETER基本概念 1. 测试计划:顶级菜单,代表一个测试计划: 2. 线程组:代表一个要测试的场景(各种相关的交易集合),对于性能测试来说可以指定多少个用户完成这个场景的内容,对于自动化测试 ...
- 26、EXCEL—插入的文字,如何修改其内的边间距
在形状格式-文本选项里面设置文本框的间距
- Spring系列之类路径扫描和注册组件-8
目录 类路径扫描和注册组件 `@Component` 使用元注释和组合注释 自动检测类和注册 Bean 定义 使用过滤器自定义扫描 在组件中定义 Bean 元数据 命名自动检测到的组件 为自动检测的组 ...
- Android studio应用
菜单的使用 public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundl ...
- 8、HTTP Cookie管理器
如果有需要加的cookie 就选择添加 如果没有特殊的 就默认就好了 第一次访问是没有cookie的 会话 session Cookie 是明文的 Session id 是保存在cookie里 ...
- 安装SQL Server 2008 R2出现的问题及解决方法(配合Visual Studio )
学校的一个作业需要SQL Server,所以就安装一个,没想到还真是有不少问题 总结:遇到问题,取消安装,完全删除(注册表啥的,小心,细心),重新安装. tips:彻底删除SQL Server应用及组 ...
- EurekaServer高可用搭建
生产环境中需要搭建集群达到高可用.eurekaServer每个实例可以注册到其他一个或多个eurekaServer实例中达到高可用.配置比较简单 比如: application-master.prop ...
- 版本不兼容(NoSuchMethodError: com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank)
"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspri ...
- CH573 CH582 OTA例程讲解(使用固定库+扩大APP空间)
例程中提供的两种OTA就不过多介绍了,在BLE目录下有一个PDF专门讲解:WCH蓝牙空中升级(BLE OTA) 方式一是带库升级,整个codeflash分成四个区域,Jump IAP,APP,OTA, ...
- Swagger UI教程 API 文档神器 搭配Node使用 web api 接口文档 (转)
http://www.68idc.cn/help/makewebs/qitaasks/20160621620667.html 两种方案 一.Swagger 配置 web Api 接口文档美化 二.通过 ...