位运算总结

所有数据在计算机中都是以二进制的形式存储的,两个数值间的位运算就是对他们的二进制形式进行处理。
在Java中,位运算有以下这些:

与运算

与运算的符号为&,两个数字进行与运算,每一位上有0就变为0,都是1则为1,例:

1
1 & 0 = 0; // 全部1和全部0做与运算为全部0

或运算

或运算的符号为|,两个数字进行或运算,每一位上有1就变为1,都是0则为0,例:

1
1 | 0 = 1; // 全部1和全部0做或运算为全部1

异或运算

异或运算的符号为^,两个数字进行异或运算,每一位上数字相同则为0,不同则为1,例:

1
1 ^ 0 = 1; // 全部1和全部0,每一位都不相同,故结果全为1

异或运算有一个简单的应用是交换两个变量:

1
2
3
4
int a, b;
a = a ^ b;
b = a ^ b;
a = a ^ b; // a 和 b 已完成交换

取反运算

取反运算的符号为~,对某个数字进行取反运算,每一位上数字0变为1,数字1变为0,例:

1
~0 = -1; // 全为1,即-1;

左移运算

左移运算的符号为<<,对某个数字进行左移运算,该数字的二进制数就整体向左移动一定位数,右边使用0来补充,例:

1
1 << 1 = 2;

带符号右移运算

带符号右移运算的符号为>>,对某个数字进行带符号右移运算,该数字的二进制数就整体向右移动一定位数,左边使用符号位(首位是0就补0;首位是1就补1)来补充,例:

1
2
2 >> 1 = 2;
-2 >> 1 = -1;

无符号右移运算

无符号右移运算的符号为>>>,对某个数字进行无符号右移运算,该数字的二进制数就整体向右移动一定位数,左边使用0来补充,例:

1
2
2 >>> 1 = 2;
-2 >>> 1 = 2147483647;

值得注意的是,移位运算符只能处理整数运算符,对于char、byte、short类型,在进行移位之前,都将被转换成int类型,移位后的结果也是int类型
移位符号右边的操作数只截取其二进制的后5位(目的是防止因为移位操作而超出int类型的表示范围:2的5次方是32,int类型的最大范围是32位);对long类型进行移位,结果仍然是long类型,移位符号右边的操作符只截取其二进制的后6位