1.是什么
在Java中,位运算是一种直接对整数在内存中的二进制位进行操作的方式(注意:在计算机运算时,都是以补码的方式来运算的,例如:加减乘除,按位与(&)等等)。以下是按位与(&)、按位或(|)、按位异或(^)以及按位取反(~)的详细解释和举例:
不了解什么是补码的小伙伴可以看看另一期:
#彻底弄清:原码、反码、补码-CSDN博客
按位与(&)
按位与运算符对两个操作数进行逐位比较,如果两个位都是1,则结果的对应位为1;否则,为0。
举例:
public class Test {
public static void main(String[] args){
System.out.println(2&3);
}
}
答案:2
图解:
按位或(|)
按位或运算符对两个操作数进行逐位比较,如果两个位中至少有一个是1,则结果的对应位为1;如果两个位都是0,则结果的对应位为0。
举例:
public class Test {
public static void main(String[] args){
System.out.println(-2|3);
}
}
答案:-1
图解:
#可以看出负数的原码转换为补码比较复杂
按位异或(^)
按位异或运算符对两个操作数进行逐位比较,如果两个位不相等,则结果的对应位为1;如果两个位相等,则结果的对应位为0。
举例:
public class Test {
public static void main(String[] args){
System.out.println(5^-3);
}
}
答案:-8 #注意:按位异或运算必须是一个为1,另一个为0,则结果为1,这题就不做解释了,原理和上面的图解一样,小伙伴们可以自己做做再对答案!
按位取反(~)
按位取反运算符对一个操作数进行逐位取反,即将所有的1变成0,所有的0变成1。
举例:
public class Test {
public static void main(String[] args){
System.out.println(~-2);
}
}
答案:1
图解:
总结:
-
按位与(AND):
- 这是一种二进制运算,其中两个位都是1时结果才是1,否则结果是0。对于有符号整数,使用补码表示时,按位与会正确地处理符号位。
-
按位或(OR):
- 这也是一种二进制运算,其中至少有一个位是1时结果是1,只有两个位都是0时结果才是0。同样,使用补码表示有符号整数时,按位或也会正确处理符号位。
-
按位异或(XOR):
- 这种运算中,两个位不相同时结果是1,相同时结果是0。在补码系统中,按位异或同样适用于有符号整数。
-
按位取反(NOT):
- 这个操作将所有的位从0变成1,从1变成0。在补码系统中,按位取反可以用来生成一个数的相反数的补码(但不包括加1这一步)。
这些位运算符在进行运算时,并不关心操作数是有符号还是无符号的,它们只是简单地对每一位进行操作。然而,当涉及到解释结果时,如果操作数被解释为有符号整数,那么通常会使用补码来得到正确的符号解释。
例如,对于两个有符号整数,按位与、按位或和按位异或的结果也是补码形式的有符号整数。而按位取反操作本身不会产生一个有效的补码表示(除非你之后再加1来得到一个数的相反数的补码),但它仍然是在补码的基础上进行的操作。
好啦,今天的干货就到这啦~ 有什么建议或疑问的小伙伴欢迎到评论区留言!