Java中那些烦人的位运算(&,|...)
JAVA ... 运算 那些
2023-09-14 08:58:06 时间
& 和 && 相同点:
都表示“与”操作。这里的“与”和数学中的“与或非”中的“与”意义相同,都遵循“一假必假”原则。即“与”符号两边的元素只要有一个为假,"与"操作执行后的结果就为假。
& 和 && 的区别:
1)
& 表示“按位与",这里的”位“是指二进制位(bit)。
例:十进制数字8 转化为二进制是:1000 ;数字9 转化为二进制是1001 。
则如有以下程序:
public class Test {
public static void main(String[] args) {
System.out.println(9 & 8);
}
}
输出结果应该是:8
原因:1001 & 1000 = 1000 。 计算机中一般1表示真,0表示假。最左边一位1&1=1,最右边一位1&0 = 0.
- && 表示逻辑”与“ ,即java中的boolean值才可以存在于&&符号的左右两侧。
true && false = false ,true && true = true , 依旧是"一假必假"。
值的注意的是:&& 符号有所谓的“短路原则”,当 A && B 出现时,如果A经判断是假,那么B表达式将不会获得执行或被判断的机会。直接结果就为假。
注:关于十进制与二进制的转换,简单的说每四位可以遵循”8421“原则,1001即8+1=9,1011即8+2+1=11
Java中的>> << >>>
<< 表示左移,不分正负数,低位补0
>> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1
>>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
System.out.println("16 << 1 : " + (16 << 1));
System.out.println("16 >> 3 : " + (16 >> 3));
System.out.println("16 >> 10 : " + (16 >> 10));
System.out.println("1 >> 1 : " + (1 >> 1));
System.out.println("16 >>> 2 : " + (16 >>> 2));
System.out.println("-16 >> 2 : " + (-16 >> 2));
System.out.println("-16 << 2 : " + (-16 << 2));
System.out.println("-16 >>> 2 : " + (-16 >>> 2));
打印结果
16 << 1 : 32
16 >> 3 : 2
16 >> 10 : 0
1 >> 1 : 0
16 >>> 2 : 4
-16 >> 2 : -4
-16 << 2 : -64
-16 >>> 2 : 1073741820
简单理解:
<< 1 相当于乘以2
>> 1 相当于除以2
>>> 不考虑高位的正负号,正数的 >>> 等同于 >>
|=
关于 |= 运算符:|= 运算符和 += 这一类的运算符一样,拆解开就是 a = a | b;
代码如下:
public static strictfp void main(String[] args) {
int a = 5; // 0000 0101
int b = 3; // 0000 0011
a |= b; // 0000 00111
System.out.println(a);
}
具体规则为:两个二进制对应位为0时该位为0,否则为1。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行|运算,后三位的的对应位都不是同时等于0,所以最终结果为 0000 0111 也就是7的二进制。
&=
&= 和 |= 基本是一样的,只不过对于比较同位方式不同。
代码如下:
public static strictfp void main(String[] args) {
int a = 5; // 0000 0101
int b = 3; // 0000 0011
a &= b; // 0000 0001
System.out.println(a);
}
具体规则为:两个二进制对应位都为1时,结果为1,否则结果为都0。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行&运算,只有最后一位都为1,则最终结果为 0000 0001 也就是1的二进制。
^=
运算规则还是同上。
代码如下:
public static strictfp void main(String[] args) {
int a = 5; // 0000 0101
int b = 3; // 0000 0011
a ^= b; // 0000 0110
System.out.println(a);
}
具体规则为:两个二进制对应位相同时,结果为0,否则结果为1。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行^运算,1-5位对应位都是0所以1-5位都为0,第8位都为1所以第8位也为0,其他的对应位都不相等所以为1,则最终结果为 0000 0110 也就是6的二进制。
相关文章
- 深入java面向对象四:Java 内部类种类及使用解析(转)
- Java 网络编程
- Java 开发环境配置--eclipse工具进行java开发
- JAVA学习(一):Java介绍及其平台、开发环境的配置与搭建
- Java实现 LeetCode 649 Dota2 参议院(暴力大法)
- Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
- Java实现 LeetCode 521 最长特殊序列 Ⅰ(出题人:“就是喜欢看你们不敢相信那么简单,又不敢提交的样子。”)...
- Java中那些烦人的位运算(&,|...)
- Java_myBatis_一对多映射
- java 11 标准Java异步HTTP客户端
- 【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容
- 【JAVA】 02-Java对象细节
- HADOOP:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable终于解决了
- java生成验证码的逻辑
- java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器
- 深入理解JAVA虚拟机--Idea远程执行本地Java代码
- java 11 Java Flight Recorder
- 【JAVA】Java 异常中e的getMessage()和toString()方法的异同
- 【JAVA】 02-Java对象细节
- Java预科篇1-学前
- JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...
- 在知乎逮到一个腾讯10年老Java开发,聊过之后收益良多...
- 使用Java标准的java.util.EventListener实现观察者-发布者设计模式
- 华为OD机试 - 简单的解压缩算法(Java & JS & Python)
- Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
- What is the reason for - java.security.spec.InvalidKeySpecException: Unknown KeySpec type: java.security.spec.ECPublicKeySpec
- 高性能Java Web 页面静态化技术
- mysql-connector-java与Mysql、Java的对应版本
- java String去除两端的空格和空字符
- java - 详解 Java 17 中新推出的密封类
- 【java】Java 中泛型的实现原理