Java 位运算符


简介

java 中有七个位运算符 分别是& 、| 、~ 、^ 、<< 、 >> 、 >>> 博客中对于每一个运算符否进行了简单的介绍。


一、运算符介绍

运算符运算规则备注
&(与运算)1&1 = 0, 0&1 =0,0&0=0
∣ \mid (或运算)1 ∣ \mid 1=1,1 ∣ \mid 0 = 1,0 ∣ \mid 0 = 0
^(异或运算)0^0=0, 0^1=1, 1^0=1, 1^1=0
<< (左移运算符)m<<n ⇒ \Rightarrow m × \times × 2^n低位补0
>> (右移运算符)m>>n ⇒ \Rightarrow ÷ \div ÷ 2^n正数高位补0 负数高位补1
>>> (无符号右移)m>>>n m 指定要移位值n移动的位数。无论正负数高位补0

二、运算示例

1.左移运算符

左移运算符(正数示例 32位高位0省略):

8<<2 
8 转化为二进制数字为:1000
左移两位为: 0010 0000
转为十进制数为: 32
等价于: 8 * 2^2 = 32

左移运算符(负数示例):

在计算机中负值以其正值的补码形式出现

-8<<2 
8的原码:0000 0000 0000 0000 0000 0000 0000 1000
8的反码:1111 1111 1111 1111 1111 1111 1111 0111
8的补码:1111 1111 1111 1111 1111 1111 1111 1000
因此-8的二进制表示为:
        1111 1111 1111 1111 1111 1111 1111 1000
左移两位为: 
        1111 1111 1111 1111 1111 1111 1110 0000
转为反码:
        1111 1111 1111 1111 1111 1111 1101 1111
转为原码        
        0000 0000 0000 0000 0000 0000 0010 000
转为十进制数:
        32
加上符号为:
        -32
等价于: -8 * 2^2 = -32

左移运算符(代码示例):

public static void main(String[] args) {
		int a = 8;
		int b = 2;
		int c = -8;
		System.out.println(Integer.toBinaryString(a));//二进制输出
		System.out.println(Integer.toBinaryString(c));//二进制输出
		System.out.println(a<<b);
		System.out.println(c<<b)
	}

输出结果为:

1000 //8的二进制表示
11111111111111111111111111111000 // -8的二进制表示
32   // 8 左移两位结果
-32  // -8左移两位结果

2.右移运算符

右移运算符(正数示例 32位高位0省略):

8 >>2 
8 转化为二进制数字为:1000
右移两位为: 10 //高位补0 (省略了)
转为十进制数为: 2

右移运算符(负数示例):

在计算机中负值以其正值的补码形式出现

-8>>2 
8的原码:0000 0000 0000 0000 0000 0000 0000 1000
8的反码:1111 1111 1111 1111 1111 1111 1111 0111
8的补码:1111 1111 1111 1111 1111 1111 1111 1000
因此-8的二进制表示为:
        1111 1111 1111 1111 1111 1111 1111 1000
右移两位为: 
        1111 1111 1111 1111 1111 1111 1111 1110 //高位补1
转为反码:
        1111 1111 1111 1111 1111 1111 1111 1101
转为原码        
        0000 0000 0000 0000 0000 0000 0000 010
转为十进制数:
        2
加上符号为:
        -2

右移运算符(代码示例):

public static void main(String[] args) {
		int a = 8;
		int b = 2;
		int c = -8;
		System.out.println(Integer.toBinaryString(a));//二进制输出
		System.out.println(Integer.toBinaryString(c));//二进制输出
		System.out.println(a>>b);
		System.out.println(c>>b);
		}

输出结果为:

1000 //8的二进制表示
11111111111111111111111111111000 // -8的二进制表示
2  //8 右移两位结果
-2 //-8 右移两位结果

2.无符号右移运算符

无符号右移移运算符(正数示例 32位高位0省略):

8 >>> 2 
8 转化为二进制数字为:1000
右移两位为: 10 //高位补0 (省略了)
转为十进制数为: 2

无符号右移运算符(负数示例):

在计算机中负值以其正值的补码形式出现

-8>>2 
8的原码:0000 0000 0000 0000 0000 0000 0000 1000
8的反码:1111 1111 1111 1111 1111 1111 1111 0111
8的补码:1111 1111 1111 1111 1111 1111 1111 1000
        1111 1111 1111 1111 1111 1111 1111 1000
因此-8的二进制表示为:
        1111 1111 1111 1111 1111 1111 1111 1000
右移两位为: 
        0011 1111 1111 1111 1111 1111 1111 1110 //高位补0 (符号位为0变为正数 正数原码反码补码相同)
转为十进制数:
        1073741822

无符号右移运算符(代码示例):

public static void main(String[] args) {
		int a = 8;
		int b = 2;
		int c = -8;
		System.out.println(Integer.toBinaryString(a));//转为二进制
		System.out.println(Integer.toBinaryString(c));//转为二进制
		System.out.println(a>>>b);
		System.out.println(c>>>b);
		System.out.println(Integer.toBinaryString(c>>>b));
	}

输出结果为:

1000 //8的二进制表示
11111111111111111111111111111000 // -8的二进制表示
2  //8 无符号右移两位结果
1073741822//-8 无符号右移两位结果
111111111111111111111111111110//-8 无符号右移两位的二进制结果 (前面省略了2个0)

总结

位运算符中& 、|、^、~ 这四个运算符的运算较为简单,没有在此进行具体的讨论,相对复杂的右移、无符号右移、左移运算都给除了具体的例子,帮助理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值