【问题标题】:Bitwise operation on floating point numbers (for graphics)? [duplicate]浮点数的按位运算(用于图形)? [复制]
【发布时间】:2011-01-13 16:57:56
【问题描述】:

可能重复:
how to perform bitwise operation on floating point numbers

大家好!

背景:
我知道可以对图形应用按位运算(例如 XOR)。我也知道,在图形程序中,图形数据通常以浮点数据类型存储(例如,能够将数据与 1.05“相乘”)。所以对浮点数据进行按位运算应该是可以的吧?

我需要能够对浮点数据执行按位运算。我确实想将数据转换为 long,按位操作,然后转换回浮点数。

我认为,有一种数学方法可以实现这一点,它更优雅 (?) 和/或更快 (?)。

我已经看到了一些答案,但他们无能为力,包括this one

编辑:
另一个问题涉及空指针转换,这将依赖于更深层次的数据表示。所以它不是这样的“完全重复”。

【问题讨论】:

  • 这是同一个问题,所以不能回答这个问题的人也不能回答这个问题。
  • 链接文章中的有用建议在其 cmets 中:检查您使用的浮点数,检查其表示,然后相应地操作位(如果前 24 位是尾数,则屏蔽前 24 位并操纵它们)。
  • 不,其他问题涉及空指针转换,这将依赖于更深层次的数据表示。
  • 很少有位运算对浮点数据有意义。一些掩蔽技巧可以在一些罕见的情况下提供帮助,但在 quake 的 invSqrt 技巧之外,我从未见过任何有用的 bitmagic 在浮点数上的应用。如果你能告诉我们你想做什么操作会很有帮助。
  • 所有按位运算都将依赖于底层表示(这是明确定义的),因为位只存在于底层表示中。

标签: math floating-point integer bit-manipulation


【解决方案1】:

当“图形数据”出现在屏幕上时,它都不是浮点数。按位运算实际上是在位串上完成的。由于二进制编码方案一致,按位运算仅对数字有意义。除了提取指数或尾数之外,尝试对浮点数进行任何类型的逻辑按位运算都是通往地狱的道路。

基本上,您可能不想这样做。你为什么认为你会这样做?

【讨论】:

  • 那么投射到长、操纵和投射回就足够好和快了吗?
  • @java:什么语言?例如,在 C 语言中,我不相信有任何开销。
【解决方案2】:

浮点数只是内存中二进制的另一种表示形式,因此您可以:

  • 测量数据类型的大小(例如 32 位),例如大小(像素)
  • 获取指向它的指针 - 为此选择一个相同大小的整数类型,例如UINT *ptr = &pixel
  • 使用指针的值,例如新像素=(*ptr)^(*ptr)

这至少应该适用于非负值并且不应该有相当大的计算开销,至少在像 C++ 这样的非托管上下文中是这样。也许您在进行操作时必须屏蔽一些位,并且 - 根据类型 - 您可能必须分别处理指数和基数。

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 2015-05-25
    • 2011-07-17
    • 1970-01-01
    • 2010-12-15
    • 2022-07-17
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多