位运算符
首先要知道数字在计算机中的存储形式,转化为二进制,正数(原码,补码),负数以补码形式存在对于一个负数,进行位运算首先把数字换成它的原码形式,然后再反码,再补码,对补码进行位运算,然后,把结果反码再原码,再十进制。
&与运算符
如果相对应位都是1,则结果为1,否则为0
public static void main(String[] args) {
int n = 2;
int m = 3;
// n: 0010
// m: 0011
// &:-------
// 0010
System.out.println(n&m); // 2
}
|或运算符
如果相对应位都是 0,则结果为 0,否则为 1
public static void main(String[] args) {
int n = 2;
int m = 3;
// n: 0010
// m: 0011
// |:-------
// 0011
System.out.println(n|m);
}
^异或运算符
如果相对应位值相同,则结果为0,否则为1
public static void main(String[] args) {
int n = 2;
int m = 6;
// n: 0010
// m: 0110
// |:-------
// 0100
System.out.println(n^m);
}
~非运算符
加1乘以-1
public static void main(String[] args) {
byte p = 1;
byte p2 = -1;
// 对于正数p来说,结果是加1*-1
System.out.println(~p);
// 对于负数p来说,结果是加1*-1
System.out.println(~p2);
int num = 987654321;
// -987654322
System.out.println(~num);
}
<<左移运算符
按位左移运算符。左操作数按位左移右操作数指定的位数。
m<<n相当于m乘以2的n次方
// 相对于2* 2的3次方
byte b = 2 << 3;
System.out.println(b); // 16
// 4:0000 0100.
// 0001 0000.
System.out.println( 4 << 2); // 16
// -4:1000 0100 | 1111 1011 | 1111 1100
// 1100 0000 | 1101 1111 | 1010 0000
System.out.println(-4 << 3); // -32
>>右移运算符
按位右移运算符。左操作数按位右移右操作数指定的位数。
m>>n 相对于m除以2的n次方
// -20: 1001 0100 | 1110 1011 | 1110 1100
// -20右移3位 1111 1101 | 1111 1100 | 1000 0011
System.out.println(-20>>3); //-3
无符号位右移>>>
按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
byte b = -8;
// 把-8换成int型的补码,右移,左边高位补零,忽略符号位
// b:1000 1000 | 1111 0111 | 1111 1000.
// 1111 1111 1111 1111 1111 1111 1111 1000.
// 001111 1111 1111 1111 1111 1111 1111 10
System.out.println(b >>> 2); //1073741822