位操作符总结

以下是java位操作符的小总结,具体如下

  二进制负数以它正值的补码形式表达

  补码:反码+1等于补码

  比如:System.out.println(Integer.toBinaryString(-5));

  打印:1111 1111 1111 1111 1111 1111 1111 1011  不用想了肯定是32位

  过程是这样的

  一个负数,比如-5,它的二进制在java里面是这样表示

  1000 0000 0000 0000 0000 0000 0000 0101

  它的正值是

  0000 0000 0000 0000 0000 0000 0000 0101

  反码是

  1111 1111 1111 1111 1111 1111 1111 1010

  再加上1是

  1111 1111 1111 1111 1111 1111 1111 1011

  即得到打印的内容

  java ~ 操作符,对每个二进制位的内容求反,即1变成0,0变成1

  测试负数

  int a = -5;//101;

  System.out.println(~a);

  打印:4

  过程是这样的,首先表示出来这个负数

  1111 1111 1111 1111 1111 1111 1111 1011(上面已经提到为什么这样表示)

  各位取反得到

  0000 0000 0000 0000 0000 0000 0000 0100

  转为10进制得到4

  测试正数:

  int a = 5;//101;

  System.out.println(~a);

  打印:-6

  首先表示出来这个正数

  0000 0000 0000 0000 0000 0000 0000 0101

  各位取反得到

  1111 1111 1111 1111 1111 1111 1111 1010

  这个代表的就是-6了,至于为什么看最上面

  java & 操作符,对应的二进制位进行与操作,两个都为1才为1,其他情况均为0

  测试

  System.out.println(5&6);

  打印:4

  过程

  5表示成:0000 0000 0000 0000 0000 0000 0000 0101

  6表示成:0000 0000 0000 0000 0000 0000 0000 0110

  进行 & :0000 0000 0000 0000 0000 0000 0000 0100

  得到:4

  java | 操作符,对应的二进制位进行或操作,两个都为0才为0,其他情况均为1

  测试

  System.out.println(5|6);

  打印:7

  过程

  5表示成:0000 0000 0000 0000 0000 0000 0000 0101

  6表示成:0000 0000 0000 0000 0000 0000 0000 0110

  进行 | :0000 0000 0000 0000 0000 0000 0000 0111

  得到:7

  java ^ 操作符 当对应二进制位值相同,该位为0 否则为1

  测试

  System.out.println(5^6);

  打印:3

  过程

  5表示成:0000 0000 0000 0000 0000 0000 0000 0101

  6表示成:0000 0000 0000 0000 0000 0000 0000 0110

  进行 ^ :0000 0000 0000 0000 0000 0000 0000 0011

  得到:3

  java << 操作符,左边移动,右面填充0

  测试

  System.out.println(5<<1);

  打印:10

  5表示成:0000 0000 0000 0000 0000 0000 0000 0101

  进行 <<1 操作:0000 0000 0000 0000 0000 0000 0000 1010

  java >> 操作符,左边移动,右面填充0

  测试

  System.out.println(5>>>1);

  打印:2

  5表示成:0000 0000 0000 0000 0000 0000 0000 0101

  进行 >>>1 操作:0000 0000 0000 0000 0000 0000 0000 0010

  左移动一位相当乘以2 右移动一位相当处以2

 

 
package c03;
public class URShift {	
	public static void main(String[] args) {
		int i = -1;
		i >>>= 10;
		System.out.println(i);
	}
}


package c03;
public class URShift {	
	public static void main(String[] args) {
		int i = -1;
		i >>>= 10;
		System.out.println(i);
	}
}


其结果为:4194303
怎么来的呢?
因为java里的int型是32位的,且负数的存储以补码(符号位保持不变,其他位是存储数的绝对值按位取反加1)方式:故而-1在存储空间的存放为:
其值为2^32-1=4294967255;


故而无符号右移10位:变成如下图所示:

其值为2^22-1=4194303;
对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:

package c03;

public class URShift {
	
	public static void main(String[] args) {
		int i = -1, j = 10000;
		i >>= 10;
		j >>= 10;
		System.out.println(i + ", " + j);
	}
}

package c03;

public class URShift {
	
	public static void main(String[] args) {
		int i = -1, j = 10000;
		i >>= 10;
		j >>= 10;
		System.out.println(i + ", " + j);
	}
}


输出为:-1, 9
拿-1为例,因为右移,高位补1,所以-1的右移始终不变.

然后求补码加1;

100000000000000000000000000000001


再例,-100带符号右移四位,其值为-7:
原码为:

100000000000000000000000001100100


补码为:

111111111111111111111111110011100


右移四位后:

111111111111111111111111111111001


保留符号位,按位取反:

100000000000000000000000000000110


再加1,即得原码:

100000000000000000000000000000111

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值