java 位运算常用技巧
2016-07-14 15:23
435 查看
(1) m<<n:左移—m左移n位,最左边n位丢弃,最右补n个0。
数乘2n:相当于数左移n位;注意,除操作慎用右移,注意负数情况。
(2) m>>n:右移—最右边n位丢弃,最左边0补位(无符号)/符号位补最左边。
**利用右移对最右边的位进行与运算,判断数为0还是1://判断奇数、偶数
** 0:(c&1)==0 c >>= 1;
** 1: (c&1)==1) c >>= 1;
(3) 常见位操作:
A. 获取某位的值:
num &(1<<i) 将1左移i位与原值相与,其他位为0,可判断i位的值。
B. 某位的值置1:
num |(1<<i) 将1左移i位与原值相或,其他位不变, i位的值置1。
C. 某位的值清0:掩码思想
num & ~(1<<i) 将1左移i位取反与原值相与,其他位不变, i位的值清0。
num& ( (1<<i) -1) 将最高位至i位(含)清零
num & ~( ( 1<<(i+1) -1) 将i位至0位(含)清零
D. 更新:
(num & ~(1 << i)) | (v << i) //v为1则将num的i位更新为1,否则为0.
(4) &与&&
A. &&逻辑与、||逻辑或的短路特性可以代替递归出口判断:
boolean b = (n!=0)&&((f +=f(n-1)) > 0 );
逻辑与(&&)前-不成立时,不进行后-的计算,从而控制n==0时不再递归。
B. &可用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位。
** 检查n是否为2的某次方(二进制中只有一个1):((n & (n-1))==0)
**把一个整数减去1,再与原数相与,相当于把整数二进制最右边一个1变成0.
数乘2n:相当于数左移n位;注意,除操作慎用右移,注意负数情况。
(2) m>>n:右移—最右边n位丢弃,最左边0补位(无符号)/符号位补最左边。
**利用右移对最右边的位进行与运算,判断数为0还是1://判断奇数、偶数
** 0:(c&1)==0 c >>= 1;
** 1: (c&1)==1) c >>= 1;
(3) 常见位操作:
A. 获取某位的值:
num &(1<<i) 将1左移i位与原值相与,其他位为0,可判断i位的值。
B. 某位的值置1:
num |(1<<i) 将1左移i位与原值相或,其他位不变, i位的值置1。
C. 某位的值清0:掩码思想
num & ~(1<<i) 将1左移i位取反与原值相与,其他位不变, i位的值清0。
num& ( (1<<i) -1) 将最高位至i位(含)清零
num & ~( ( 1<<(i+1) -1) 将i位至0位(含)清零
D. 更新:
(num & ~(1 << i)) | (v << i) //v为1则将num的i位更新为1,否则为0.
(4) &与&&
A. &&逻辑与、||逻辑或的短路特性可以代替递归出口判断:
boolean b = (n!=0)&&((f +=f(n-1)) > 0 );
逻辑与(&&)前-不成立时,不进行后-的计算,从而控制n==0时不再递归。
B. &可用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位。
** 检查n是否为2的某次方(二进制中只有一个1):((n & (n-1))==0)
**把一个整数减去1,再与原数相与,相当于把整数二进制最右边一个1变成0.
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树