&,两位同时为1时结果为1,否则为0。
|,两位同时为0时结果为0,否则为1。
^,两位相等结果为0,不相等为1。
~,一元运算符,取反,即1返回0、0返回1。~1=-2
将二进制数字向左移动,移动几位就在最右侧补多少个0。例如 3<<1,因为3的二进制表示形式为11,向左移动一位后变为110,所以 3<<1=6。左移n位相当于乘上2的n次方。左移,按位左移,低位补0,溢出位忽略。
将二进制数字向右移动,移动几位就在最右侧消去多少个比特位,并最左侧填充符号位。例如 3>>1,因为3的二进制表示形式为011,所以向右移动一位后变为001,所以 3>>1=1。例如 -3>>1,因为-3的二进制补码表示为
111111111111111111111111111111011 2,所以带符号向右移动一位后变为
11111111111111111111111111111110,对应的数字为-2,所以 -3>>1=-2。1左移一位会变成0,0左移依旧为0
将二进制数字向右移动,移动几位就在最右侧消去多少个比特位,并最左侧填充0。
例如 -3>>>1,因为-3的二进制补码表示为
11111111111111111111111111111101,所以无符号向右移动一位后变为
01111111111111111111111111111110,对应的数字为2147483646,所以 -3>>>1=2147483646
Java数值运算过程中都是先将十进制转换为二进制然后再进行运算,再把二进制数据转换为十进制展现给用户。二进制运算规则如下:
对于有符号的而言,最高位为符号位,0表示正数,1表示负数
特殊的:0的反码和补码都是0(可以考虑下为什么?可以借助最后的代码进行验证)
计算机的运算的时候,都是将原码转成补码进行运算的
下面以 -1 为例子展示原码、反码和补码的转换关系(以int数据类型为例,int类型在Java中占4字节,32位)
Java打印二进制编码:
public class BinaryTest {
public static void main(String[] args) {
print(1);
System.out.println();
print(-1);
}
static void print(int num) {
// 从第32位开始进行异或(原数值中是1的留下)
for (int i = 31; i >= 0; i--) {
System.out.print((num & 1 << i) == 0 ? "0" : 1);
}
}
}
小思考:
# 问题:
Integer.MAX_VALUE的相反数
Integer.MIN_VALUE的相反数
# 打印下尝试下吧~
public static void main(String[] args) {
print(Integer.MIN_VALUE);
System.out.println();
print(-Integer.MIN_VALUE);
}