Java基础——位运算符
一、Java中的位运算符
Java语言的位运算符主要的操作数是整数类型(字节:byte、字符:char、短整型:short、整型:int、长整型:long)。所有的整数类型(除了char 类型之外)都是有符号的整数,即,有正数也有负数。在Java语言中,整数类型在计算机内部是以二进制补码的形式进行表示和存储的,在补 码 表 示 中 ,最高 位 为 符号 位 ,非负整数的符号位为0,负数的符号位为1,运算结果为整数。位运算符主要是满足编程中的特殊要求,例如,测试设备、与硬件通讯等高级编程。
描述 | 位运算符 | 用法 |
按位与 | & | op1 & op2 |
按位或 | | | op1 | op2 |
按位取反 | ~ | ~op1 |
按位异或 | ^ | op1 ^ op2 |
按位左移 | << | op1 << op2 |
按位右移 | >> | op1 >> op2 |
无符号按位右移 | >>> | op1 >>> op2 |
二、整数的补码
非负整数的补码与通常所表示的二进制数相同,例:10的补码
负整数的补码计算方法:1.先计算出负整数的相反数的二进制补码,用0填充其高位,直到填满其所占的内存位数;
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
2.按位取反;例:10的补码按位取反
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
三、按位运算
(
一)按位与(&)
两个数的二进制补码在内存位数相同的位置上同为1时为1,其他都为0。例3 & 6:
3的二进制补码:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
/**
* 测试位运算符
* @author javamsj
* @version 1.0 2017-06-29
* @since J2SE 1.8
*/
public class Operator {
public static void main(String[] args) {
int x = 3; //属性赋值
int y = 6;
System.out.println(x & y); //按位与
}
}
运行结果为:2
(二)按位或(|)
两个数的二进制补码在内存位数相同的位置上同为0时为0,其他都为1。例3 | 6:
3 | 6的二进制补码:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
/**
* 测试位运算符
* @author javamsj
* @version 1.0 2017-06-29
* @since J2SE 1.8
*/
public class Operator {
public static void main(String[] args) {
int x = 3; //属性赋值
int y = 6;
System.out.println(x | y); //按位或
}
}
运行结果为:7
(三)按位异或(^)
两个数的二进制补码在内存位数相同的位置上相同为0,不同为1。例3 | 6:
3 ^ 6的二进制补码:
实现代码:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
/**
* 测试位运算符
* @author javamsj
* @version 1.0 2017-06-29
* @since J2SE 1.8
*/
public class Operator {
public static void main(String[] args) {
int x = 3; //属性赋值
int y = 6;
System.out.println(x ^ y); //按位异或
}
}
运行结果:5
(四)按位右移(>>)
按位右移(>>)运算是将第一个操作数表示成二进制补码形式,然后将二进制补码为序列 右移第二个操作数指定的位数。右端移除的地位将自动被舍弃,空出的位置以符号位填充,如果是非负整数则使用0填充,是负整数使用1填充。例,3 >> 2:
3的二进制补码:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
/**
* 测试位运算符
* @author javamsj
* @version 1.0 2017-06-29
* @since J2SE 1.8
*/
public class Operator {
public static void main(String[] args) {
int x = -3; //属性赋值
int y = 2;
System.out.println(x >> y); //按位右移
}
}
运行结果:0
(五)按位左移(<<)
按位左移(<<)运算是将第一个操作数的二进制补码为序列依次左移第二个操作数指定的位数,舍弃移除的高位,空出低位用0补充。
按位左移(<<)运算是将第一个操作数的二进制补码为序列依次左移第二个操作数指定的位数,舍弃移除的高位,空出低位用0补充。
例,3 << 2的二进制补码:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
/**
* 测试位运算符
* @author javamsj
* @version 1.0 2017-06-29
* @since J2SE 1.8
*/
public class Operator {
public static void main(String[] args) {
int x = -3; //属性赋值
int y = 2;
System.out.println(x << y); //按位左移
}
}
运行结果:12
(六)无符号按位右移(>>>)
无符号按位右移(>>>)运算是将第一个操作数表示成二进制补码形式,然后将二进制补码为序列 右移第二个操作数指定的位数。右端移除的地位将自动被舍弃,空出的位置以0填充。例-3 >>>2:
无符号按位右移(>>>)运算是将第一个操作数表示成二进制补码形式,然后将二进制补码为序列 右移第二个操作数指定的位数。右端移除的地位将自动被舍弃,空出的位置以0填充。例-3 >>>2:
3的二进制补码:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
/**
* 测试位运算符
* @author javamsj
* @version 1.0 2017-06-29
* @since J2SE 1.8
*/
public class Operator {
public static void main(String[] args) {
int x = -3; //属性赋值
int y = 2;
System.out.println(x >>> y); //无符号按位右移
}
}
运行结果:1073741823
3的二进制补码:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
参考文献:
李兴华. 《Java开发实战经典》. 北京:清华大学出版社出版,2009
雍俊海. 《Java程序设计教程(第3版)》. 北京:清华大学出版社出版,2014
雍俊海. 《Java程序设计教程(第3版)》. 北京:清华大学出版社出版,2014
本文由作者整理而得,如需转载请注明。
由于本人水平有限,如有错误请多多谅解,大家可以留言本文的存在错误信息。谢谢大家阅读。