所有数据在计算机中都是以二进制的形式存储的,两个数值间的位运算就是对他们的二进制形式进行处理。
在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 | int a, b; |
取反运算
取反运算的符号为~,对某个数字进行取反运算,每一位上数字0变为1,数字1变为0,例:
1 | ~0 = -1; // 全为1,即-1; |
左移运算
左移运算的符号为<<,对某个数字进行左移运算,该数字的二进制数就整体向左移动一定位数,右边使用0来补充,例:
1 | 1 << 1 = 2; |
带符号右移运算
带符号右移运算的符号为>>,对某个数字进行带符号右移运算,该数字的二进制数就整体向右移动一定位数,左边使用符号位(首位是0就补0;首位是1就补1)来补充,例:
1 | 2 >> 1 = 2; |
无符号右移运算
无符号右移运算的符号为>>>,对某个数字进行无符号右移运算,该数字的二进制数就整体向右移动一定位数,左边使用0来补充,例:
1 | 2 >>> 1 = 2; |
值得注意的是,移位运算符只能处理整数运算符,对于char、byte、short类型,在进行移位之前,都将被转换成int类型,移位后的结果也是int类型
移位符号右边的操作数只截取其二进制的后5位(目的是防止因为移位操作而超出int类型的表示范围:2的5次方是32,int类型的最大范围是32位);对long类型进行移位,结果仍然是long类型,移位符号右边的操作符只截取其二进制的后6位