0
点赞
收藏
分享

微信扫一扫

Java学习日记---位运算

老王420 2022-03-12 阅读 87

1.原码、反码、补码

对于有符号的:

1.二进制的最高位是符号位,0表示正数,1表示负数

2.正数的原码、反码、补码都一样

3.负数的反码:它的原码符号位不变,其他位取反

4.负数的补码:它的反码+1,负数的反码 : 负数的补码 -1

5.0的反码补码都是0

6.java没有无符号数即java中的数都是有符号的

7.在计算机运算的时候,都是以补码的方式来运算的

8.当我们再看运算结果的时候,要看它的原码。

2.位运算

按位与&:两位都为1时为1,否则为0

// 2的补码 00000000 00000000 00000000 00000010
// 3的补码 00000000 00000000 00000000 00000011
//  2 & 3 = 00000000 00000000 00000000 00000010 
System.out.println(2&3); //2

按位或|:两位有一个1时为1,否则为0

System.out.println(2|3);//3
//1.2的补码 00000000 00000000 00000000 00000010
//  3的补码 00000000 00000000 00000000 00000011
// 2. 2|3   00000000 00000000 00000000 00000011

按位异或^:两位不同时为1,否则为0

System.out.println(2^3);//1
//1.2的补码 00000000 00000000 00000000 00000010
//  3的补码 00000000 00000000 00000000 00000011
// 2.2^3    00000000 00000000 00000000 00000001

按位取反~:位1->0,0->1

System.out.println(~-2);
// 1. -2的原码 10000000 00000000 00000000 00000010
// 2. -2的反码 11111111 11111111 11111111 11111101
// 3. -2的补码 11111111 11111111 11111111 11111110
// 4. 取反     00000000 00000000 00000000 00000001 ->补码		
// 5. 结果为1  
		

System.out.println(~2);//-3
//1.2的补码 00000000 00000000 00000000 00000010
//2.取反	   11111111  11111111 11111111 11111101 补码
//3.求该补码的反码 11111111 11111111 11111111 11111100
//4.求该反码的原码 10000000 00000000 00000000 00000011

算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位,右移一次相当与除以2

System.out.println(-2>>2);//-1
//1.1的补码:11111111 11111111 11111111 11111110
//2.右移两位 11111111 11111111 11111111 11111111
//3.因为运算用的是补码 得到的也是补码 查看结果要把它转为原码
//4.原码:该补码的反码11111111 11111111 11111111 11111110
//5.补码的原码 10000000 00000000 00000000 00000001
//6.结果为-1

算术左移<<:符号位不变,低位补0,左移一次相当与乘以2

System.out.println(2<<2);//8
//1.2的补码 00000000 00000000 00000000 00000010
//2.左移两位 00000000 00000000 00000000 00001000
//结果为8

逻辑右移>>>:无符号右移,低位溢出,高位补0

右移左移本质:二进制->10进制:各位数的2的(位数-1)次方之和;左移一位1,相当于多乘一次2。

举报

相关推荐

0 条评论