Math 浮点数的位运算(用于图形)?

Math 浮点数的位运算(用于图形)?,math,floating-point,integer,bit-manipulation,Math,Floating Point,Integer,Bit Manipulation,可能重复: 各位好! 背景: 我知道可以对图形应用位运算(例如XOR)。我还知道,在图形程序中,图形数据通常以浮点数据类型存储(例如,能够将数据与1.05“相乘”)。所以必须能够对浮点数据执行位运算,对吗 我需要能够对浮点数据执行位运算。我不想将数据强制转换为long,按位操作,然后强制转换回float 我认为,有一种数学方法可以实现这一点,它更优雅(?)和/或更快(?) 我已经看到了一些答案,但他们也无能为力,包括 编辑: 另一个问题涉及void指针转换,它将依赖于更深层次的数据表示。所以它

可能重复:

各位好!

背景:
我知道可以对图形应用位运算(例如XOR)。我还知道,在图形程序中,图形数据通常以浮点数据类型存储(例如,能够将数据与1.05“相乘”)。所以必须能够对浮点数据执行位运算,对吗

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

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

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

编辑:
另一个问题涉及void指针转换,它将依赖于更深层次的数据表示。所以它不是一个“精确的副本”。

当“图形数据”出现在屏幕上时,没有一个是浮点。按位操作实际上是在位字符串上完成的。位运算只对数字有意义,因为二进制的编码方案是一致的。除了提取指数或尾数之外,尝试对浮点进行任何类型的逻辑位运算都是一条地狱之路

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

当“图形数据”出现在屏幕上时,没有一个是浮点。按位操作实际上是在位字符串上完成的。位运算只对数字有意义,因为二进制的编码方案是一致的。除了提取指数或尾数之外,尝试对浮点进行任何类型的逻辑位运算都是一条地狱之路


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

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

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

<>这至少应该与非负值一起工作,并且应该没有相当大的计算开销,至少在C++之类的非托管上下文中是如此。可能在执行操作时必须屏蔽某些位,并且根据类型,可能必须分别处理指数和基数。

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

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

<>这至少应该与非负值一起工作,并且应该没有相当大的计算开销,至少在C++之类的非托管上下文中是如此。可能在执行操作时需要屏蔽一些位,并且根据类型的不同,可能需要分别处理指数和基数。

这是一个完全相同的问题,因此任何无法回答该问题的人也无法回答此问题。链接文章中的有用建议是:检查您使用的浮点,检查其表示,然后相应地操作位(如果前24位是尾数,则屏蔽前24位并对其进行操作)。不,其他问题涉及无效指针转换,这将依赖于更深层次的数据表示。很少有按位操作对浮点数据有意义。一些掩蔽技巧在一些罕见的场景中会有所帮助,但除了quake的invSqrt技巧之外,我从未见过bitmagic在浮点上的任何有用应用。如果你能告诉我们你想做什么操作,那会很有帮助。所有按位操作都依赖于底层表示(定义良好),因为位只存在于底层表示中。这是完全相同的问题,所以任何不能回答这个问题的人,也无法回答这个问题。链接文章中的有用建议是:检查您使用的浮点,检查其表示形式,然后相应地操纵位(如果前24位是尾数,则屏蔽前24位并操纵它们)。不,其他问题涉及无效指针转换,这将依赖于更深层次的数据表示。很少有按位操作对浮点数据有意义。一些掩蔽技巧在一些罕见的场景中会有所帮助,但除了quake的invSqrt技巧之外,我从未见过bitmagic在浮点上的任何有用应用。如果你能告诉我们你想做什么操作,那会很有帮助。所有按位操作都将依赖于底层表示(定义良好),因为位只存在于底层表示中。那么长时间强制转换、操纵和回溯就足够好和快了?@java:什么语言?例如,在C语言中,我不相信会有任何开销。那么,长时间的转换、操作和回溯就足够好和快了?@java:什么语言?例如,在C语言中,我不认为有任何开销。