1、位或 : |=
两个二进制数,对应位置都为0时,为0,否则为1
/**
* 按位或,对应位置都为0,则为0,否则为1
*/
public static void fisrtOperation() {
int a = 5; //0101
int b = 7; //0111
//------
a |= b; //0111
System.out.println(a); // 7
}
2、位与:&=
两个二进制数,对应位都为1时,为1,否则为0
/**
* 按位与,对应位置都为1,则为1,否则为0
*/
public static void secondOperation(){
int a = 5; //0101
int b = 7; //0111
//------
a &= b; //0101
System.out.println(a); // 5
}
3、异或:^=
两个二进制数,对应位置相同为0,不同为1
/**
* 异或,对应位置相同为0,不同为1
*/
public static void thirdOpreation(){
int a = 5; //0101
int b = 7; //0111
//------
a ^= b; //0010
System.out.println(a); // 2
}
4、左移 <<
/**
* 左移n位,右边补0
*/
public static void fourthOpreation() {
int a = 5; //0101
a = a << 1;
System.out.println(a); // 1010 --10
int b = 8; // 1000
b = b << 2;
System.out.println(b); //0010 0000 -- 32
}
5、右移 >>
/**
* 右移n位,左边补0
*/
public static void fifthOpreation() {
int a = 5; //0101
a = a >> 1;
System.out.println(a); // 0010
int b = 8; // 1000
b = b >> 2;
System.out.println(b); //0010
}
6、无符号右移 >>>
/**
* 无符号右移,向右位移指定位数,左边补0
*/
public static void sisthOperation(){
int a = 31; //0001 1111
a = a >>> 2;
System.out.println(a); //0000 0111
}
7、取反 ~ 按位非
/**
* 取反
*/
public static void fourthOpreation(){
int a = 5; //0110
System.out.println(~a); //1001
}
负数(一个字节为例)
1 的二进制 0000 0001
-1的二进制 1000 0001
最高位为符号位,0为正数,1为负数
正数的反码,补码都和其源码相同
负数的反码,除符号位以外取反
-1的反码 1111 1110
补码为反码加一 1111 1111
二进制只有加法,要作减法可将减数当作负数
取其补码,与被减数作加法(加法都是补码操作,正数相加,源码就是其补码)
例 29 -73
29的补码 0001 1101
-73的源码 1100 1001
取反 1011 0110
加一1011 0111 这是-73的补码
补码相加得 1101 0100 ,这是结果的补码,要得到源码,即补码转源码
补码转源码,取反 ,加一既可以得到源码
1101 0100 取反得 :1010 1011 再加一得 1010 1100 转成10进制为 -44
同理 73 -29
73源码 0100 1001
-29 源码 1001 1101 取反得 1110 0010 再加一得 1110 0011 为补码
补码相加:0010 1100 得到为正数,补码即为源码 值44