Java基础——位运算符

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的补码
00000000000000000000000000001010
负整数的补码计算方法:1.先计算出负整数的相反数的二进制补码,用0填充其高位,直到填满其所占的内存位数;
    2.按位取反;例:10的补码按位取反
11111111111111111111111111110101
     3.最低位加1,得负整数补码。例,-10的补码
11111111111111111111111111110110

三、按位运算

一)按位与(&)
两个数的二进制补码在内存位数相同的位置上同为1时为1,其他都为0。例3 & 6:
3的二进制补码:
000000000000000000000000000000011
6的二进制补码:
00000000000000000000000000000110
3 & 6的二进制补码:
00000000000000000000000000000010
实现代码:
/**
 * 测试位运算符
 * @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的二进制补码:
00000000000000000000000000000111
实现代码:
/**
 * 测试位运算符
 * @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的二进制补码:
00000000000000000000000000000101
实现代码:
/**
 * 测试位运算符
 * @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的二进制补码:
00000000000000000000000000000011
3 >> 2的二进制补码:
00000000000000000000000000000000
实现代码:
/**
 * 测试位运算符
 * @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补充。
例,3 << 2的二进制补码:
00000000000000000000000000001100
实现代码:
/**
 * 测试位运算符
 * @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:
3的二进制补码:
00000000000000000000000000000011
~3的二进制补码:
11111111111111111111111111111100
-3的二进制补码:
11111111111111111111111111111101
-3 >>> 2的二进制补码:
00111111111111111111111111111111
实现代码:
/**
 * 测试位运算符
 * @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

按位异或运算的性质:设op1和op2是任意两个整数,则运算(op1 ^ op2) ^ op2的结果与op1相同,(op1 ^ op2) ^ op1的结果与op2相同。例(3 ^ 2) ^ 2
3的二进制补码:
00000000000000000000000000000011
2的二进制补码:
00000000000000000000000000000010
3 ^ 2的二进制补码,结果为1
00000000000000000000000000000001
(3 ^ 2) ^ 2的二进制补码,结果为3
00000000000000000000000000000011
(3 ^ 2) ^ 3的二进制补码,结果为2
00000000000000000000000000000010



参考文献:

        李兴华.  《Java开发实战经典》.  北京:清华大学出版社出版,2009
       雍俊海.  《Java程序设计教程(第3版)》.    北京:清华大学出版社出版,2014


本文由作者整理而得,如需转载请注明。
由于本人水平有限,如有错误请多多谅解,大家可以留言本文的存在错误信息。谢谢大家阅读。















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值