不用额外变量交换两个整数的值
package bitop;
/**
* 不用额外变量交换两个整数的值
* @author z8g
*/
public class SwapIntegerValue {
public static void main(String[] args) {
int a = 10;
int b = -20;
a ^= b;
b ^= a;
a ^= b;
System.out.println(a + " " + b); // -20 10
}
}
不用任何比较找出两个数中较大的数
package bitop;
/**
* 不用任何比较找出两个数中较大的数
*
* @author z8g
*/
public class FindMaxNumber {
public static void main(String[] args) {
FindMaxNumber s = new FindMaxNumber();
System.out.println(s.max(-1, -2)); // -1
System.out.println(s.max(2, -2)); // 2
}
// 如果a-b的值为正数或0,则sign为0,flip为1,返回b
public int max(int a, int b) {
int remaining = a - b;
int sign = sign(remaining);
int flip = flip(sign);
return a * sign + b * flip;
}
// 整数和0返回1,负数返回0
private int sign(int n) {
return flip((n >> 31) & 1);
}
// 如果n为1,返回0;如果n为0,返回1
private int flip(int n) {
return n ^ 1;
}
}
整数的二进制表达中有多少个1
package bitop;
/**
* 整数的二进制表达中有多少个1
*
* @author z8g
*/
public class IntegerNumberOf1 {
public int numberOf1(int n) {
int res = 0;
while (n != 0) {
n -= n & (~n + 1); // n & (~n + 1) 用于得到最右边的1
res++;
}
return res;
}
}
找出数组中出现次数为奇数次的数
package bitop;
import java.util.Arrays;
/**
* 找出数组中出现次数为奇数次的数
*
* @author z8g
*/
public class FindNumberInArray {
public static void main(String[] args) {
FindNumberInArray s = new FindNumberInArray();
int[] arr1 = {1, 2, 2, 3, 3, 4, 4, 4, 4};
System.out.println(s.find1(arr1));
int[] arr2 = {1, 2, 3, 3, 4, 4, 4, 4};
System.out.println(Arrays.toString(s.find2(arr2)));
}
// 有一种数出现了奇数次
public int find1(int[] arr) {
int n = 0;
for (int i = 0; i < arr.length; i++) {
n ^= arr[i];
}
return n;
}
// 有两种数出现了奇数次
public int[] find2(int[] arr) {
int n = find1(arr); // n = a ^ b
int rightOne = n & (~n + 1);
int eOhasOne = 0;
for (int i = 0; i < arr.length; i++) {
if ((arr[i] & rightOne) != 0) {
eOhasOne ^= arr[i];
}
}
return new int[]{eOhasOne, (n ^ rightOne)};
}
}