博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
位运算基础及其常见应用
阅读量:7008 次
发布时间:2019-06-28

本文共 2224 字,大约阅读时间需要 7 分钟。

最近在看jdk源码,发现很多时候用到位运算,由于本人不是本专业的,很多位运算的内容不理解。于是上网整理位运算的一些基础知识与常用应用,以供复习、查询。  

## 位运算基础  

System.out.println(3 & 6);   //2->10, 位与,有0为0,反之为1        System.out.println(3 | 6);      //7->111,位或,有1为1,反之为0        System.out.println(3 ^ 6);   //5->101,位异或,同0或同1为0,反之为1        System.out.println(~3);       //-4-> 11111111111111111111111111111100,取反        System.out.println(3 >> 1);       // 1 ,右移,代替除2        System.out.println(3 << 1);       // 6,左移,代替乘2        //负数无符号右移与右移区别,无符号右移不区分正负,右移在正数的右移基础上加个负号        System.out.println(-6 >>> 1);       //2147483645, 无符号右移        System.out.println(-6 >> 1);       // -3复制代码

## 位运算进阶

  • 判断某位上是否为1或设置为1的写法,拓展应用就是枚举子类,见
System.out.println(6 >> 2 & 1);       // 1,判断从右向左第3位上是否为1        //偶数最低位二进制为0,因此可以利用这点判断奇偶        System.out.println(3 & 1);       // 1,3为奇数        System.out.println(6 & 1);       // 0,6为偶数        System.out.println(6 | 1 << 3);       // 14,把6从右向左第4位设置为1复制代码
//枚举集合["A","B","C","D"]的子集,由乘法原理可以轻易得出共2的4次方16个子集        List
list = Lists.newArrayList("A","B","C","D"); //0-15分别对应16个子集,把0-15转为二进制数,位数上为1的字母放入结果即可 for (int i = 0; i < 2 << 4; i++) { List
tempList = new ArrayList<>(); for(int j=0; j<4;j++){ if(((i>>j)&1)==1){ tempList.add(list.get(j)); } } System.out.print(tempList.toString()+" ");复制代码

顺便说一下,楼主业余学了下python,这题还有一种很python的解法,代码如下:

import itertoolsfor i in range(5):    print([x for x in itertools.combinations(["A","B","C","D"],i)])复制代码
  • a=a^b^b的两种运用(b^b=0)
//在成双成对的数找唯一的值(简称找单身狗)        List
list = Lists.newArrayList(1, 2, 3, 4, 2, 3, 1); Integer res = 0; for (Integer x : list) { res ^= x; } System.out.println(res); //4 除了4是单身狗,其他都是成双成对的复制代码
//交换a,b的值        int a = 2, b = 3;        a=a^b;        b=a^b;        a=b^a;        System.out.printf("a=%d,b=%d%n", a, b);复制代码
  • a^(a-1)去除a二进制数最后一个1
System.out.println(7 & 6);  //111->110即 5        System.out.println(6 & 5); //110->100即 4        //2的n次方只有一个1,可用此判断是否为2的幂,如下        System.out.println(8 & 7); //1000->0000即 0复制代码

以上是位运算在实际中常见的应用,当然还有其他很多技巧未被挖崛,这里就不收录了。

转载于:https://juejin.im/post/5c373db1e51d45517d2f987f

你可能感兴趣的文章
[转]水晶报表自动补空行及格线(无分组版)
查看>>
PHP里用户密码的回复和管理
查看>>
jqprint导入jqgrid表格时,内容溢出的原因以及解决方法
查看>>
IOS self.使用
查看>>
POJ1151 Atlantis
查看>>
UltraEdit编辑器使用心得之正则表达式篇
查看>>
dnspod 批量添加记录
查看>>
ZCMU训练赛-H(模拟)
查看>>
Codeforces Round #449 (Div. 2) A. Scarborough Fair【多次区间修改字符串】
查看>>
CCCC L1-039. 古风排版【图形输出/循环控制行列/模拟/细节】
查看>>
POJ 1182 食物链 【带权并查集/补集法】
查看>>
V字形
查看>>
Flask学习笔记(3)-数据库迁移
查看>>
Hbase常用操作
查看>>
一行命令学会全基因组关联分析(GWAS)的meta分析
查看>>
第二阶段冲刺——six
查看>>
模块封装代码
查看>>
《Machine Learning》(第一章)序章
查看>>
【右键禁用U盘的小技巧】
查看>>
执行sql语句后的数据处理api
查看>>