【问题标题】:Division by 10 in hexadecimal十六进制除以 10
【发布时间】:2020-03-04 03:23:58
【问题描述】:

我需要将十六进制数的最后 6 个小数位与数字的其余部分分开。

十进制除以 10 与十六进制右移 4 次 (x >> 4) 相同。 我试图向右移动,但我从来没有得到正确的值。

Hex: 0x7A 11F8 5EE0
Dec: 524.297.500.000

我想将小数点后 6 位分隔成一个新变量:

524.297.500.000 -> 524.297
a = 524.297
b = 500.000
repeat time
    0x7A 11F8 5EE0 >> 4

我正在使用十六进制数字。

问题:

  1. 我应该向右移动多少次才能去掉最后 6 位小数?
  2. 二进制还是十六进制的位移(除以 10)更快?

【问题讨论】:

  • 右移 4 是除以 16,无论外部(字符串)表示发生在哪个数字系统中。
  • 没有十进制或十六进制数字。只有数字。但是您可以表示十六进制、十进制、八进制、二进制或任何其他基数的数字。
  • 您永远无法仅使用位移位除以十进制数。
  • @FredLarson 没问题,您必须移动 3.3219280948873623478703194294893901759... 个位置 ;)
  • 我的电脑使用 BCD(二进制编码的十进制),所以我可以移位除以 10。

标签: c math division


【解决方案1】:

正如各种 cmet 所说,换档不会达到你想要的效果。而你想要什么本身就不清楚了!

但是,您可以使用传统的除法和模运算符实现您所需要的效果。比如:

int x = 524297500;
int a = x / 1000; // 524297
int b = x % 1000; // 500

这只是一个快速而肮脏的答案。此外,您会注意到我使用的数字比您小,并且分隔了后 3 位(不是 6 位)小数位。那只是因为您的示例太大而无法放入 int (通常是 32 位长)中,我想展示这个想法,而不是整数类型系统的细节。

【讨论】:

    【解决方案2】:

    [所有数字十进制]

    如果您(无论出于何种原因)需要使用位移将整数除以 10,您首先需要将要除以的整数转换为其 BCD 表示形式。

    根据您是使用 BCD 还是打包 BCD,您需要右移 8 位或 4 位才能除以 10。

    【讨论】:

      【解决方案3】:

      另外,移位若干位与除以位值相同。我想知道你的困惑是否来自于此。

      考虑这种情况十进制

      value: 213423
      shifted right by one digit: 21342  (the 3 gets discarded)
      

      我们可以看到这与除以10并向下舍入相同:

      value: 213423
      divide by 10: 21342.3
      round down: 21342
      

      移位一位数和除以 10 给出相同的答案,因为每个数位的位值都是 10。

      现在十六进制每个数字的位值为 16(十进制),因此右移一位十六进制数字与除以 16(十进制)相同。

      最后,二进制每个数字的位值都是2,因此移位一位与除以2(十进制)相同。并且由于二进制的工作原理,移位四与除以 16(十进制)相同。

      所以每个人都说“一个数字不是十进制或十六进制,但你可以表示一个数字为十进制或十六进制”这样的话是正确的。但是移位操作与表示有关。十进制移位 1 与除以 10 相同。最后的问题是,在 C 中,您的唯一选择是以二进制移位,这相当于十进制除以 2、4、8 , 16...

      我希望这会有所帮助,而不是进一步搅浑水!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-16
        • 2020-10-04
        • 2018-07-26
        • 2011-12-09
        • 1970-01-01
        • 2014-08-24
        • 2012-03-14
        • 2014-04-20
        相关资源
        最近更新 更多