【问题标题】:I need help on Bit Twiddling我需要关于 Bit Twiddling 的帮助
【发布时间】:2013-05-14 17:29:14
【问题描述】:

我喜欢看到人们编写 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);

最好使用&gt;&gt;&gt;&gt;&gt; 运算符我的意思是在Joshua Bloch 修复损坏的二进制搜索之后,我知道使用&gt;&gt;&gt; 代替&gt;&gt; 是安全的。请帮助,如果有教程,那么上面提到的来源我将非常感激。

计算位输出的最简单方法是什么,例如1 | 2 = 3

我的意思是我不知道位形式的外观,除非我使用计算器或其他东西。有没有最简单的方法可以在没有任何帮助的情况下计算这些东西?

【问题讨论】:

  • 您似乎在寻求教程或其他内容,而不是针对特定问题的解决方案。你会在这里得到一些东西,但要获得更完整的包,请尝试计算机编程的艺术第 7.1.3 章和 Hacker's Delight。

标签: java bit-manipulation bit


【解决方案1】:

计算位输出的最简单方法是什么,例如 1 | 2 = 3。

把数字写成二进制。这就是数字的真实表示方式。

  00000001
| 00000010
= 00000011

【讨论】:

  • 地震平方根算法怎么样?只是玩游戏可靠还是出故障?
  • @huseyintugrulbuyukisik 我猜你的意思是betterexplained.com/articles/… 我相信它对于游戏来说已经足够好了。考虑到所有其他不切实际的事情,我怀疑这没有什么区别。
  • @huseyintugrulbuyukisik 不,不是地震平方根算法,我正在寻找的基础不是那么先进.. 谢谢.. ;)
  • 简而言之,它起作用的原因是因为数字的开头是一个指数,并且得到一个数的 log 的 sqrt 只需除以 2(或移位 1)这种形式sqrt 的牛顿近似的起始近似。如果您对此进行第二次迭代,结果会更准确(但更慢)。
【解决方案2】:

你需要学习一点,但是这里有一个小备忘单可以知道二进制形式的数字

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1

如果你想要 3,从左到右,填写包含创建数字 3 所需值的空格

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
                             X   X

2 + 1 = 3 所以你用1s 替换标有X 的那些,其余的用0s 替换

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

不是规则、公式或任何东西。它只是帮助您更快地转换数字并在脑海中练习的东西。如果你想玩比特,你仍然需要大量学习:-)

【讨论】:

  • @askewchan 我觉得上面的解释很有帮助。我想知道的一件事是有任何更简单或更高级别的高级技巧,我将尝试阅读并努力提高我的技能。谢谢... :)
猜你喜欢
  • 2023-04-06
  • 2014-03-11
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多