- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
unsigned GetLowestBitPos(unsigned value)
{
double d = value ^ (value - !!value);
return (((int*)&d)[1]>>20)-1023; // This is what I really need help understanding.
}
在我看来,代码将 double 类型转换为指向整数的指针。我不确定 [1] 的用途。然后看起来我们向右移动了 20 位
对于此代码的任何帮助,我将不胜感激。自从我使用 C++ 编程以来已经有一段时间了,我正在尝试为可编程逻辑 Controller (PLC) 编写逻辑以尽可能地做同样的事情。
感谢您的帮助
最佳答案
让我们一步一个脚印。第一:
double d = value ^ (value - !!value);
如果 value = 0
,则计算结果为 0 ^ (0 - 0),因此 d
为 0。如果 value != 0
,则计算结果为 value ^ (value - 1)。这具有将值的最低一位和最低零位设置为一,并将所有其他位设置为零的效果。例如:
value = 010100100
d = 000000111
出现这种情况是因为(value - 1)
和value
是一样的,只是零位串的最低位变成了1,而下一位变成了0,由于携带
value = 010100100
value - 1 = 010100011
XOR value = 000000111
在任何情况下,d
都加载了 this 的 float 值。下一行:
return (((int*)&d)[1]>>20)-1023;
这会提取浮点指数,并加回偏差。请注意,这假定了一个小端系统,例如 x86;在大端系统上,您需要使用 [0]
。它还对 int
和 doubles
的大小做出假设 - 特别是,它假设 32 位整数和 64 位 IEEE float 。
这里的关键是非非规范化 IEEE 浮点值( double 中的 32 位 int 将始终是非非规范化的)最终的表示形式看起来有点像 1.xxxxxxxx * 2^ (e-1023)
,其中 xxxxxxxx
是小数部分,e
是指数。由于您已将感兴趣的位安排为最高阶位,因此指数以您要查找的值结束。
就是说,您可能无法在 PLC 上使用它 - 尽管这是一个非常聪明的 hack,但如果您拥有硬件 FPU,它的效率甚至会很低;甚至在 x86 系统上也有 faster built-in integer operations . this SO question 中还有许多其他技术;你可能会在那里找到一个更快的。您的 PLC 也可能有一个内置操作,也可以在一条指令中执行此操作。
关于c++ - 这段用于获取最低位位置的代码如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4766397/
我是一名优秀的程序员,十分优秀!