位掩码和二进制算术

时间:2015-04-14 12:40:32

标签: c++ binary bitmask

我想了解以下背后的科学知识。 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

2 个答案:

答案 0 :(得分:0)

(...)

  1. 如果在划分两个整数时丢失精度,则应记住余数。
  2. 在您的情况下,可以通过执行44100%48000来获取C ++中的提醒。
  3. 实际上这些是常数,而且完全清楚44100/48000 == 0,所以余下就是你所拥有的。
  4. 嗯,提醒甚至会 - 猜猜是什么 - 44100!
  5. float类型(由显式投射强加)只有6位有效数字。所以4294967296.0f将只是429496e4(在数学中:429496 * 10 ^ 4)。这就是为什么这种类型除了玩耍之外什么都不值钱。
  6. 获取固定整数类型值的最佳方法,其中所有位都已设置,并且不会错过正确数量的&#39; f&#39;在0xfffff中,是使用〜运算符和0值。在你的情况下,~uint32_t(0)。
  7. 好吧,我应该在开头说这个:44100.0/48000应该给你想要的结果。 :P

答案 1 :(得分:0)

这是我正在寻找的答案

向左移位将提供存储来自除法的精确值的位数。

将这些位表示的整数值除以2位移量的幂将返回精度值

e.g

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

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

128/2 ^ 8 = 0.5