位运算符主要是以二进制规则进行运算
1.与(&)运算符
使用规则:两个二进制操作数对应位同为1 结果位 才为1,其余情况为0;
例如:整数 a = 15 整数 b = 127
计算:(a & b)
15 的二进制位:0000 1111
127 的二进制为:0111 1111
即:(a & b) = 15
2.或(|)运算符
使用规则:两个二进制操作数对应位只要有一个为1 结果位 就为1,其余情况为0;
例如:整数 b = 127 整数 c = 128
计算:(b | c)
127 的二进制位:0111 1111
128 的二进制位:1000 0000
即:(b | c) = 255
3.非(~)运算符
使用规则:一个二进制操作数,对应位为0,结果位为1;对应位为1,结果位为0;
作用是将每位二进制取反
例如:整数 d = 1
计算:(~d)
十进制 1 的二进制表示为:
0000 0001
每位都取反为:
1111 1110
这是内存中的保存形式。我们读取的十进制是根据原码来读取,而在内存中,数值都是以二进制补码形式存储的。正数的补码和原码一样,负数的补码得到过程:原码 转 反码 再转 补码
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
传送门:原码, 反码, 补码 详解
然后计算取反后的补码,其真值就是结果。
即:(~d) = -2
4.异或(^)运算符
使用规则:两个二进制操作数对应位相同为0,不同为1;
例如:整数 e = 2 整数 f= 3
计算:(e ^ f)
2 的二进制位:0000 0010
3 的二进制位:0000 0011
即:(e ^ f) = 1
5.移位运算符(<< 和 >>)
移位运算符组成的表达式也属于算术表达式,其值为算术值。左移运算是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。
5.1 左移(<<)运算符
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
语法格式:需要移位的数字number << 移位的次数
例如:整数 g = 10
计算:g<<2
10 的二进制位:0000 1010
数学意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
5.2 右移(>>)运算符
按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
语法格式:需要移位的数字number >> 移位的次数
例如:整数 h = -7(这里只列出了计算负数的右移运算,正数运算高位直接补0就行了)
计算:h >> 2
计算流程:首先将负数进行转换为反码 ——>补码,将转换为补码的负数的二进制形式向右位移,空出的高位全补符号位1,再将位移后的二进制操作数进行转换为反码 ——> 补码,通过补码计算出来的结果就是一个负整数位移后的结果。
数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。
6.代码实现
public class Bitwise {
public static void main(String[] args){
int a = 15;
int b = 127;
int c = 128;
int d = 1;
int e = 2;
int f = 3;
int g = 10;
int h = -7;
int I = 10;
System.out.println("a和b的 与运算 结果为:" + (a & b));
System.out.println("b和c的 或运算 结果为:" + (b | c));
System.out.println("d 非运算 的结果为:" + (~d));
System.out.println("e和f 异或运算 的结果为: " + (e ^ f));
System.out.println("g 左移2位运算 的结果为: " + (g << 2));
System.out.println("h 右移2位运算 的结果为: " + (h >> 2));
System.out.println("I 右移1位运算 的结果为: " + (I >> 1));
}
}
运算结果:
a和b的 与运算 结果为:15
b和c的 或运算 结果为:255
d 非运算 的结果为:-2
e和f 异或运算 的结果为: 1
g 左移2位运算 的结果为: 40
h 右移2位运算 的结果为: -2
I 右移1位运算 的结果为: 5