我喜欢看到人们编写 Bit Twiddling 代码,但我根本无法理解。通过 Hacker's Delight 和http://graphics.stanford.edu/~seander/bithacks.html,但我什么都不懂。
例如:
如何1 | 2
返回3
或如何a ^=b; b ^= a; a ^=b;
交换值等......
一种方法:
private T[] ensureCapacity(int minCapacity) {
if (tmp.length < minCapacity) {
// Compute smallest power of 2 > minCapacity
newSize |= newSize >> 1;
int newSize = minCapacity;
newSize |= newSize >> 2;
newSize |= newSize >> 4;
newSize |= newSize >> 8;
newSize |= newSize >> 16;
newSize++;
if (newSize < 0) // Not bloody likely!
newSize = minCapacity;
else
newSize = Math.min(newSize, a.length >>> 1);
@SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"})
T[] newArray = (T[]) new Object[newSize];
tmp = newArray;
}
return tmp;
}
以下喜欢的人在做什么:
int newSize = minCapacity;
newSize |= newSize >> 1;
newSize |= newSize >> 2;
newSize |= newSize >> 4;
newSize |= newSize >> 8;
newSize |= newSize >> 16;
newSize++;
或者
newSize = Math.min(newSize, a.length >>> 1);
更好地使用>>
or>>>
运算符我的意思是在 Joshua Bloch 修复了损坏的二进制搜索之后,我明白使用它是安全>>>
的>>
。请帮助,如果有教程,那么上面提到的来源我将非常感激。
例如,计算位输出的最简单方法是什么1 | 2 = 3
?
我的意思是我不知道位形式的外观,除非我使用计算器或其他东西。有没有最简单的方法可以在没有任何帮助的情况下计算这些东西?