对byte、short类型进行位运算,
会先转为int类型再运算,返回值也是int类型,
对long类型进行位运算,返回值也是long类型。
计算机运算的时候,是将原码转换为补码进行的。
正数的原码、反码、补码都一样的,负数的补码:
我们以-1为例,byte类型占了1字节、8位。
&,两位同时为1时结果为1,否则为0。
1^3=2
|,两位同时为0时结果为0,否则为1。
1|3=3
^,两位相等结果为0,不相等为1。
1^3=2
~,一元运算符,取反,即1返回0、0返回1。
~1=-2
<<,左移,按位左移,低位补0,溢出位忽略。
-16<<2=-64
'>>,右移,按位右移,若正数高位补0,负数高位补1。
-16>>2=-4
'>>>,右移,按位右移,高位补0,溢出位忽略。
16>>>2=4
偶数最低位一定是0,奇数最低位一定是1。1只有最低位是1,其它位都是0,
任何数和1进行与运算,除了最低位,其它位肯定得到0,以此判断奇偶性。
127&1=1,127是奇数。
我们需要知道:
异或运算符合交换律,
任何数和它本身进行异或运算结果都是0,
任何数和0进行异或运算结果都是它本身。
public static void main(String[] args) {
int a = 3;
int b = 4;
a = a ^ b;
b = b ^ a;
a = a ^ b;
System.out.println(a);
System.out.println(b);
}
推导:
a = a ^ b;
b = b ^ a = b ^ (a ^ b) = b ^ b ^ a = 0 ^ a = a;
a = a ^ b = (a ^ b) ^ (b ^ (a ^ b)) = (a ^ a) ^ (b ^ b) ^ b = b;
原理同上。
package com.example.duohoob.hash;
public class HashMapTest {
public static void main(String[] args) {
// 加密key
int key = 1234567;
// 加密前的字符串
String str = "hello world";
// 一次异或加密
byte[] bytes = str.getBytes();
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) (bytes[i] ^ key);
}
// 加密后的字符串
String sign = new String(bytes);
System.out.println(sign);
// 两次异或解密
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) (bytes[i] ^ key);
}
System.out.println(new String(bytes));
}
}