我喜欢看到人们编写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
?
我的意思是我不知道比特形式看起来如何,除非我使用计算器或其他东西..有没有最简单的方法来计算这些东西而没有任何帮助,但记住了?
答案 0 :(得分:1)
计算比特输出的最简单方法是什么,例如1 | 2 = 3。
将数字写为二进制。这就是数字的实际表现方式。
00000001
| 00000010
= 00000011
答案 1 :(得分:1)
你需要学习一点,但这里有一个小的备忘单,以二进制形式知道数字
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
如果你想要3,请从左到右,填写包含创建数字3所需值的空格
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
X X
2 + 1 = 3,因此您将标有X
的标记替换为1
s,其余标记替换为0
s
00000011
数字2相同:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
X
二进制结果是。
00000010
编号47:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
X X X X X
二进制结果:
00101111
这是不规则,公式或其他任何内容。它只是帮助您更快地转换数字,并在脑海中练习它。如果你想玩位,你还需要学习很多东西:-)