免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动
1.位运算
1.1 原码,反码,补码
对有符号的数而言:
- 二进制的最高位是符号位:0表示正数,1表示负数(0->0 1->-)
- 正数的原码,反码,补码都一样(三码合一)
- 负数的反码=他的原码符号位不变,其他位取反(0变1,1变0)
- 负数的补码=它的反码+1 负数的反码=负数的补码-1
- 0的反码 补码都是0
- Java没有无符号数,换言之,Java中的数都是由符号的
- 在计算机运算的时候,都是以补码的方式来运算的
- 当我们看运算结果的时候,要看他的原码(重点)
1.2 位运算符
Java中有7个位运算(&,|,^,~,>>,<<,>>>)
public class BitOperator { public static void main(String[] args) { //2&3 推导 //1.先得到2的补码 =>2的原码 00000000 00000000 00000000 00000010 //2的补码 00000000 00000000 00000000 00000010 //2. 3的补码 3的原码 00000000 00000000 00000000 00000011 //3的补码 00000000 00000000 00000000 00000011 //3 按位& // 00000000 00000000 00000000 00000010 // 00000000 00000000 00000000 00000011 & // 00000000 00000000 00000000 00000010 运算后的补码 //运算后的原码 也是 00000000 00000000 00000000 00000010 //结果就是 2 System.out.println(2&3); //2 //~-2 推导 //1 先得到-2的原码 10000000 00000000 00000000 00000010 //-2的反码 11111111 11111111 11111111 11111101 //-2的补码 11111111 11111111 11111111 11111110 //取反(~2)操作 11111111 11111111 11111111 11111110 // 00000000 00000000 00000000 00000001 (补码) // 00000000 00000000 00000000 00000001 最高位是0 正数 所以他的原码是 // 原码:00000000 00000000 00000000 00000001 System.out.println(~-2); //1 //~2取反推导 //得到补码 00000000 00000000 00000000 00000010 //取反操作~2 11111111 11111111 11111111 11111101(运算后补码) // 是负数 负数的反码 11111111 11111111 11111111 11111100 // 负数的原码 100000000 00000000 00000000 00000011 System.out.println(~2); //-3 } }
>>、<<、>>>,运算规则是:
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移<<:符号位不变,低位补0
>>> 逻辑右移也叫无符号右移: 运算规则是:低位溢出,高位补0
public class BitOperator { public static void main(String[] args) { int a=1>>2; //1=> 00000001=>00000000 本质1/2/2=0 int c=1<<2; //1=> 00000001=>00000100 本质1*2*2=4 System.out.println(a); System.out.println(c); } }标签:11111111,反码,运算,00000000,补码,原码 From: https://www.cnblogs.com/lgs-tech/p/17888303.html