我需要Bit Twiddling的帮助

时间:2013-05-14 17:29:15

标签: java bit-manipulation bit

我喜欢看到人们编写Bit Twiddling代码,但我根本无法理解它。通过Hacker's Delight和http://graphics.stanford.edu/~seander/bithacks.html消失了,但我没理解任何事情。

例如:

1 | 2如何返回3a ^=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

我的意思是我不知道比特形式看起来如何,除非我使用计算器或其他东西..有没有最简单的方法来计算这些东西而没有任何帮助,但记住了?

2 个答案:

答案 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

这是规则,公式或其他任何内容。它只是帮助您更快地转换数字,并在脑海中练习它。如果你想玩位,你还需要学习很多东西:-)