java中用到按位运算符时,就是按照单个比特流,即二进制位。会将两个数据都转换成二进制的形式来将进行异或、或、与、非等操作。
按位运算的来源于C的低级操作。
作用:我们经常要操纵硬件,需要频繁设置硬件寄存器内的二进制位。Java的设计初衷是嵌入电视顶置盒内,所以这种低级操作被保留下来了。然而,由于操作系统的进步,现在也很少用到这种按位运算。
接下来就说异或,之前听的很多就是关于或、与、非的运算讲解和实践,现在也针对异或来进行了解并实践,让学到的东西能清楚些。
异或(XOR):相同为0,不同为1。
有时两个数据在异或后得到的结果跟两个数据的值不同,有时会跟两个值中某一个值相同。所以在用的时候应该考虑清楚。
比如:0010 ^ 0001 = 0011 这个得到的结果是不同。
0000 ^ 0011 = 0011这个得到的结果是相同的。
借鉴别人写的例子:
很多成对出现数字保存在磁盘文件中,注意成对的数字不一定是相邻的,如2, 3, 4, 3, 4, 2……,由于意外有一个数字消失了,如何尽快的找到是哪个数字消失了?
答案:这个用异或就可以解决。因为相同为0,就是自己与自己异或为0。还有异或可以满足交换律,不同顺序怎么变换得到的结果都是相同的。
有一个数字消失了,那必定有一个数只出现一次而且其它数字都出现了偶数次。用搜索来做就没必要了。
按位运算符可与等号联合使用。但是非(~)就不可以了。
我们将boolean(布尔)类型当做一种“单位”或者“单比特 ”值对待,所以它多少有些比其他值特殊处。有多个boolean值时,可以执行按位与,或和异或,但是不能执行按位非,这样可能为了避免与逻辑NOT混淆吧。
对于布尔值,按位运算符与逻辑运算符有相同的效果,只不过是不会中途“短路”。针对布尔值进行的按位运算为我们新增一个XOR逻辑运算符,但是它并没有包括在逻辑运算符的列表中。在移位运算符中,禁止使用布尔运算。