位运算符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的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面 ...
随机推荐
- Android---mediaplayer 创建和调用顺序
Android mediaframework创建mediaplayer // java层 ///frameworks/base/media/java/android/media/MediaPlayer ...
- AI基本知识
一.什么是flops 对flops有疑惑,首先得先捋清这个概念: FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为 ...
- lua按某些键排序的方法
function sort(list, ...) local opts = {...}; local len = #opts; return table.sort(list, function(a, ...
- 二叉树系列之二叉搜索树BST
特征: 1.每个元素有唯一键值 2.任意一个结点键值,比它左子树的所有结点的键值大,比它右子树的所有结点的键值小 数据的基本操作: 1>建树和插入.逐个插入其他所有数据.新插入的数据于一个最底层 ...
- 记录jupyter lab 多个kernel混乱的问题
问题描述 在Anaconda下我有多个虚拟环境,其中一个叫d2l,由于pytorch版本和cuda算力不匹配,重新create了一个环境:d2l_new.然后环境配置好了之后激活环境,启动jupyte ...
- vs2019 debug 出现: printf is ambiguous
在vs中写c++代码时,莫名其妙出现:printf is ambiguous 的错误. 第一步,有设置std namespace 删除后再输入 using namespace std; 第二步.删除u ...
- Vue项目目录树
- Shell写脚本关于ssh执行jar包,需要刷新JDK路径的问题
比如脚本中下面这一段 ssh $i "java -jar /applog/$PROJECT/$APPNAME --server.port=$SERVER_PORT >/dev/null ...
- springBoot 这货特别火
现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下. Spring Boot ...
- GDB 调试 - 正确地加载调试符号文件
一.开发流程 1. 编译可执行文件 1 #include <stdio.h> 2 #include <unistd.h> 3 4 void test() 5 { 6 char ...