【发布时间】:2013-05-14 17:29:14
【问题描述】:
我喜欢看到人们编写 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);
最好使用>> 或>>> 运算符我的意思是在Joshua Bloch 修复损坏的二进制搜索之后,我知道使用>>> 代替>> 是安全的。请帮助,如果有教程,那么上面提到的来源我将非常感激。
计算位输出的最简单方法是什么,例如1 | 2 = 3?
我的意思是我不知道位形式的外观,除非我使用计算器或其他东西。有没有最简单的方法可以在没有任何帮助的情况下计算这些东西?
【问题讨论】:
-
您似乎在寻求教程或其他内容,而不是针对特定问题的解决方案。你会在这里得到一些东西,但要获得更完整的包,请尝试计算机编程的艺术第 7.1.3 章和 Hacker's Delight。
标签: java bit-manipulation bit