Java 位运算
程序员文章站
2024-03-19 22:15:22
...
一、简单了解 Java 位运算
1、Java 有关于位操作的运算符有:
- & 与运算
- | 或运算
- ^ 异或运算
- ~ 取反
- >> 右移(用符号位填充高位)
- << 左移
- >>> 右移(用 0 填充高位)
- Java 中没有 <<<
异或 有一些比较好玩的性质:
- 交换律:任意交换因子的位置,结果不变
- 结合律:(a ^ b)^ c = a ^(b ^ c)
- 对任何数 x,都有 x ^ x = 0,x ^ 0 = x,自己同自己异或为0,同 0 异或为自己
- 自反性:A ^ B ^ B = A ^ 0 = A,连续和同一个因子做异或运算,最终结果为自己
2、一些位运算的例子
case 1: 判断奇偶数问题
原理: 奇数的最后一位为 1, 偶数的最后一位为 0
public static void odevityJudge(int num) {
if ( (num ^ 1) == 0 )
System.out.println(num + " 是偶数.");
else
System.out.println(num + " 是奇数.");
}
case 2: 获取二进制位是 1 还是 0
原理:
方法一: 目标数右移 index - 1 位, 结果和 1 与运算
方法二: 让 1 左移 index - 1 位, 结果和 1 左移后的结果数对比
public static void binaryJudge(int num, int index) {
// 方式一
if( ( (num >> (index - 1) ) & 1 ) == 1 )
System.out.println(num + " 的第 " + index + " 位是 1");
else
System.out.println(num + " 的第 " + index + " 位是 0");
// 方式二
int temp = 1 << (index - 1);
if( ( temp & num ) == temp )
System.out.println(num + " 的第 " + index + " 位是 1");
else
System.out.println(num + " 的第 " + index + " 位是 0");
}
case 3: 交换两个数的值
原理: 异或运算的自反性
public static void swap(int num1, int num2) {
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
}
case 4: 求数的绝对值
原理: int型(4字节 32位) 符号位左移溢出,最后得到的结果为 0 或 -1
public static void absoluteValue(int num) {
num = num ^ ( num >> 31) + ( num >>> 31 );
System.out.println("Result: " + num);
}
上一篇: C# MD5加密
下一篇: 一致性哈希:MurmurHash