网站首页 > java教程 正文
程序中的所有数在计算机内存中都是以二进制的形式储存的,即只有0和1两种数值,位运算就是直接对整数在内存中的二进制位进行。
1<<(向左位移)
运算规则:a<<b,表示a转为二进制后左移b位,左移后,空位补0。
例:
3: 00000000 00000000 00000000 00000011 // 左移2位,空位补2个0 3<<2: 00000000 00000000 00000000 00001100
所以,3<<2 = 12
规律:a左移b位,就是a乘以2的b次方。
2>>(向右位移)
运算规则:a>>b,表示a转为二进制后右移b位,右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1。
例:
4: 00000000 00000000 00000000 00000100 // 右移1位。右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1 4>>1 00000000 00000000 00000000 00000010
所以,4 >> 1 = 2
规律:a右移b位,就是a除以2的b次方。
3&(与运算)
运算规则:相同位的两个数字都为1,则为1;若有一个不为1,则为0。
例:
5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5&6: 00000000 00000000 00000000 00000100
所以,5&6 = 4
4|(或运算)
运算规则:相同位只要有一个为1即为1。
例:
5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5|6: 00000000 00000000 00000000 00000111
所以,5|6 = 7
5^(异或运算)
运算规则:针对二进制位,如果某位不同则该位为1, 否则该位为0。
例:
5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5^6: 00000000 00000000 00000000 00000011
所以,5^6 = 3
6~(取反运算)
运算规则:对二进制各位数进行取反,即1变成0,0变成1。
例:
5: 00000000 00000000 00000000 00000101 ~5: 11111111 11111111 11111111 11111010 // 补码形式 11111111 11111111 11111111 11111001 // 反码 10000000 00000000 00000000 00000110 // 原码
所以,~5 = -6
位运算的一些妙用
- 在不使用第三个变量的情况下,如何交换两个变量的值?
常规操作:
void swap(int a, int b) { int temp = a; a = b; b = temp; }
骚操作:
void swap(int a, int b) { a^=b; b^=a; a^=b; }
- 判断奇偶
常规操作:
if (a%2 == 0) { System.out.println("偶数"); } else { System.out.println("奇数"); }
骚操作:
if ((a&1) == 0) { System.out.println("偶数"); } else { System.out.println("奇数"); }
- 求平均数
常规操作:
int average(int x, int y) { return (x+y)/2; }
骚操作:
int average(int x, int y) { return (x&y)+((x^y)>>1); }
推荐阅读:
- 上一篇: Java运算符(java运算符号解释大全)
- 下一篇: 十四、Java运算符-逻辑运算符与位运算符
猜你喜欢
- 2024-10-18 Java 中的移位运算符(Shift Operator)
- 2024-10-18 「每日分享」把Map中的hash()分析的最透彻的文章
- 2024-10-18 从bitmap到布隆过滤器,再到高并发缓存设计策略
- 2024-10-18 Java基础入门(运算符)(java运算符的含义)
- 2024-10-18 Day03-Java运算(三年级混合运算练习题)
- 2024-10-18 浅谈java中的数学运算(java的数学公式有哪些)
- 2024-10-18 好程序员Java学习路线分享Java中的位移运算
- 2024-10-18 全网分析Map中hash方法最透彻的一篇文章
- 2024-10-18 为什么Java String哈希乘数为31?(java中string是什么数据类型)
- 2024-10-18 Java精确运算高位数数字(java计算精度问题)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)