位掩码和二进制算法

bitmasking and binary arithmetic

我想知道以下背后的科学。一个 32 位的值在 64 位类型中被左移 32 次,然后进行除法。不知何故,精度包含在最后 32 位中,为了将值检索为浮点数,我可以在无符号 32 位 int 的最大值上乘以 1。

phase = ((uint64) 44100 << 32) / 48000;
(phase & 0xffffffff) * (1.0f / 4294967296.0f);// == 0.918749988

(float)44100/48000;// == 0.918749988

(...)

  1. 如果你在除以两个整数时失去了精度,你应该记住余数。
  2. 在你的情况下,可以通过执行 44100%48000 来获取 C++ 中的提醒。
  3. 实际上这些是常量,很明显 44100/48000 == 0,所以剩下的就是余数。
  4. 好吧,提醒甚至会是——你猜怎么着——44100!
  5. float 类型(由显式强制转换强加)只有 6 位有效数字。所以 4294967296.0f 将只是 429496e4(在数学中:429496*10^4)。这就是为什么这种类型除了玩耍之外没有任何价值。
  6. 获取所有位都已设置的固定整数类型的值,并且不会错过 0xfffff 中 'f' 的正确数量的最佳方法是使用 ~ 运算符和 0 值。在你的情况下,~uint32_t(0).

好吧,我应该在一开始就这样说:44100.0/48000 应该会给你想要的结果。 :P

这就是我要找的答案

向左移位将提供用于存储除法精度值的位数。

将这些位表示的整数值除以2的位移量次方将return精度值

例如

0000 0001 * 2^8 = 1 0000 0000 = 256(基数 10)

1 0000 0000 / 2 = 1000 0000 = 128(基数 10)

128 / 2^8 = 0.5