【问题标题】:Split a non-power-of-two based int拆分基于非二次幂的 int
【发布时间】:2009-06-17 13:43:27
【问题描述】:

我知道你可以像这样将一个二的幂数分成两半:

halfintR = some32bitint & 0xFFFF
halfintL = some32bitint >> 16

你能对一个以非两个空间的幂为界的整数做同样的事情吗?

(假设您希望将您的范围限制为适合 4 位基数 52 无符号空间的整数集)

【问题讨论】:

    标签: math bit-manipulation


    【解决方案1】:

    你可以使用以下

    rightDigits = number % 2704 // 52 squared
    leftDigits = number / 2704
    

    【讨论】:

    • 为什么是平方?如果是 6 位空格,我会使用 52**3 吗?
    • 没错,你使用 52**2 来获取最后 2 位数字
    • 如果是 5 位数,我会使用 (52 * 52 * 26) 吗?另外,要反转此操作,我只需使用 (leftDigits * 52**2) + rightDigits,对吗?
    • 我不认为你可以平均分割一个 5 位数字而不用另一个基数表示它
    【解决方案2】:

    嗯,当然。 & 0xffff% 0x10000 相同,>> 16/ 0x10000 相同。只是在进行移位和屏蔽等位操作时,除以 2 的幂更有效。除法适用于任何数字(在表示范围内)。

    【讨论】:

    • 好吧,我认为对于程序员来说,移位的东西比此时使用模数或除法更容易掌握。无论如何,写下你的意思,让编译器完成剩下的工作。过早的优化和东西:)。如果你真的想除以二,那么一定要把它写成除以二而不是位移。
    • 更不用说编译器可能会找到最有效的方法来进行模数和除法的恒幂二。在几乎所有情况下,他们都比你更了解如何编写好的代码。
    【解决方案3】:

    一旦你意识到&>> 分别用于进行modulodivision 计算,你就可以写出你想要的:

    lower = some4DigitsNumberBase52 % (52 * 52)
    upper = some4DigitaNumberBase52 / (52 * 52)
    

    这是进行基数计算的基础。您还可以从以特定基数显示数字的算法得出解决方案:您如何得出最右边的两位数字和最左边的两位数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2012-07-22
      相关资源
      最近更新 更多