欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
}

相关标签: 算法随笔