1.位运算
1.1 7个位运算符【记】
- java 中有 7 个位运算(&、|、^、~、>>、<<和 >>>)
- 按位与&: 两位全为1,结果为1,否则为0
【两个数字同一个位子上都为1,则为1,否则为0】 - 按位或|: 两位有一个为1,结果为1,否则为0
- 按位异或^: 两位一个为0,一个为1,结果为1,否则为0
【2个数不同就是1,一样就是0】 - 按位取反~: 0->1,1->0
- 算术右移 >>: 符号位不变, 低位溢出,并用符号位补溢出的高位
- 算术左移 <<: 符号位不变, 低位补 0
- >>>逻辑右移:也叫无符号右移,运算规则是: 低位溢出,高位补 0
- 按位与&: 两位全为1,结果为1,否则为0
1.2 案例
- 2&3
public class var01 {
//编写一个main方法
public static void main(String[] args) {
//推导过程
//1. 获得2的补码(计算机都使用补码运算)需要先知道2的原码。2是int为4个字节
//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(按位于的计算结果)
//4. 转为原码
//结果的补码第一位(符号为为0,是正数)
//原码与补码一致
//00000000 00000000 00000000 00000010 = 2
System.out.println(2&3); //输出2
}
}
- ~ -2
public class var01 {
//编写一个main方法
public static void main(String[] args) {
//推导过程
// 1. 得到-2的原码10000000 00000000 00000000 00000010
//-2反码11111111 11111111 11111111 11111101
//-2补码11111111 11111111 11111111 11111110
//2. 按位取反
//~-2补码:00000000 00000000 00000000 00000001
//~-2转为原码,结果为1(正数3码合一)
System.out.println(~-2); //输出1
}
}
- ~ 2
public class var01 {
//编写一个main方法
public static void main(String[] args) {
//推导过程
// 1. 得到2的原码00000000 00000000 00000000 00000010
//2的补码00000000 00000000 00000000 00000010(正数三码合一)
//2. 按位取反
//~2补码:11111111 11111111 11111111 11111101
//~2反码:11111111 11111111 11111111 11111100
//~2原码:10000000 00000000 00000000 00000011(除了符号位,其他互换)
//~2 = -3
System.out.println(~2); //输出-3
}
}
- 2|3
public class var01 {
//编写一个main方法
public static void main(String[] args) {
//推导过程
// 1. 得到2的原码00000000 00000000 00000000 00000010
//2的补码00000000 00000000 00000000 00000010(正数三码合一)
//2. 3的原码为00000000 00000000 00000000 00000011
//3的补码为00000000 00000000 00000000 00000011
//按位或
//00000000 00000000 00000000 00000010
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000011(结果的补码)
//结果为3
System.out.println(2|3); //输出3
}
}
- 2^3
public class var01 {
//编写一个main方法
public static void main(String[] args) {
//推导过程
// 1. 得到2的原码00000000 00000000 00000000 00000010
//2的补码00000000 00000000 00000000 00000010(正数三码合一)
//2. 3的原码为00000000 00000000 00000000 00000011
//3的补码为00000000 00000000 00000000 00000011
//按位异或
//00000000 00000000 00000000 00000010
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000001(结果的补码)
//结果为1
System.out.println(2^3); //输出1
}
}
- int a=1>>2;
1 => 00000000 00000000 00000000 00000001
=> 00000000 00000000 00000000 00000000
【本质:算术右移1位 = 除1次2。ex. 1 / 2 / 2 =0】 - intc=1<<2;
1 => 00000000 00000000 00000000 00000001
=>00000000 00000000 00000000 00000100
【本质:算术左移1位 = 乘1次2。ex. 122=4】 - 额外练习
- ~2=? // 按位取反
- 2&3=? // 2 按位与3
- 2|3=?
- ~-5=?
- 13&7=?
- 5|4=?
- -3^3=? //^ 按位异或
2. 二进制在运算中的说明
- 二进制是逢2进位的进位制,0、1是基本算符。
- 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号。非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制 (Binary)数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1”,数字1在不同的位上代表不同的值,按从右至左的次序,值以二倍递增。
3. 原码反码补码
3.1 八个原则【背】
- 二进制的最左位是符号位:0表示正数,1表示负数(老韩口诀:0->0 1->- )
- 正数的原码,反码,补码都一样(三码合一〕
- 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
- 负数的补码 = 它的反码+1,负数的反码 = 负数的补码-1
- 0的反码,补码都是0
- java没有无符号数,换言之,java中的数都是有符号的
- 计算机是以补码的方式来运算的.
- 当我们看运算结果的时候,要看他的原码(重点)