移位运算符
<< :按位左移运算符。左操作数按位左移右操作数指定的位数。 num << 1,结果相当于num乘以2
>> :按位右移运算符。左操作数按位右移右操作数指定的位数。num >> 1,结果相当于num除以2
java.util.ArrayList.grow(int)方法中
int newCapacity = oldCapacity + (oldCapacity >> 1);
ArrayList扩容为原来的1.5倍
>>> : 无符号右移,忽略符号位,空位都以0补齐
具体应用:JDK的二分法检索代码实现中
java.util.Arrays.binarySearch(long[], long)
public static int binarySearch(long[] a, long key) {
return binarySearch0(a, 0, a.length, key);
}
// Like public version, but without range checks.
private static int binarySearch0(long[] a, int fromIndex, int toIndex,
long key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
//无符号右移
int mid = (low + high) >>> 1;//equal mid=low +(high-low)/2;
long midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
异或^运算符
异或运算规则是:两个操作数的二进制位中,相同则结果为0,不同则结果为1。
如果a、b两个值相同,异或结果为0。如果a、b两个值不相同,则异或结果为1。
一个排序数组中所有数字出现2次,其中一个数字只出现1次,找出这个数字?
public static int getonenum(int a[], int size) {
int result = 0;
for (int i = 0; i < size; i++) {
result ^= a[i];
}
return result;
}
交换两个数的值
ch[i] ^= ch[len - 1 - i];
ch[len - 1 - i] ^= ch[i];
ch[i] ^= ch[len - 1 - i];