【问题标题】:What is 12345 >> 2 Really Doing arithmetically?什么是 12345 >> 2 真的在做算术?
【发布时间】:2012-07-13 15:23:38
【问题描述】:

我的问题是在下面的例子中val = val >> 2; 做什么?那就是我相信它是除以 4。

int val = 12345678;
val = val >> 2;

这是这个问题的背景。

我有一个水表读数,比如 12345678。我们的水表工作方式是将右侧的两个数字丢弃以供读取,因此 123456 是真正的读数。 (有理由丢弃与水流如何使寄存器转动有关的两个右手数字。不过,这与我的问题无关。)

目前,我们使用 4GL 整数变量将 12345678 除以 100,所以我没有得到十进制数。我们正在被截断,我们没有预料到,我是 试图确定位移是否会更好。

读取被截断为 123456 后,使用上次读取(也被截断)计算增量,并由此产生消耗。

我在 Informix 4GL 中可以使用 C,我相信删除最低两位数的最佳方法是右移 2。我相信这是我要获得的唯一方法——因为例子——

5 digit meter   12345 --> 123
6  "     "     123456 --> 1234
7  "     "    1234567 --> 12345

感谢您容忍一个简单的问题。我们试图找出一个问题,即与仪表对话的端点是如何编程的,以及来自端点的数据真正意味着什么。

【问题讨论】:

  • 移位仅适用于 2 的幂。如果要移位十进制位,则需要除法。
  • @mystical 这不是真的 - 您可以移动浮点值并在某些条件下收到非常相似的结果,因为它们的存储方式。一个经典的例子是en.wikipedia.org/wiki/Fast_inverse_square_root
  • @corsiKa “在某些条件下” - 是的。您几乎可以将班次用于“在特定条件下”不适用的任何事情。
  • @Mysticial 如何在“特定条件下”将它用于浮动,但说它“仅用于 2 的幂”而不是在特定条件下?使用移位进行乘法和除法的想法绝对属于您所谴责的“某些条件”。
  • @corsiKa 争论术语是没有意义的。因为我们显然对“某些条件”有不同的阈值。

标签: c bit-manipulation informix 4gl meter


【解决方案1】:

位移会丢弃最后两个二进制位,而不是十进制位。它相当于整数除以四。您需要除以 100 以丢弃最后两位小数。

101111000110000101001110bin = 12345678dec

101111000110000101001110bin >> 2dec = 1011110001100001010011bin

1011110001100001010011bin = 3086419dec

【讨论】:

    【解决方案2】:

    '>>' 执行位移操作。

    要了解它的作用,您首先需要将 12345678 转换为二进制。

    12345678 = 100101101011010000111
    

    '>>' 意味着您将每个位向右移动,在您的示例中,移动 2 个位置。 (

    100101101011010000111 >> 2 = 001001011010110100001
    

    然后转回十进制:308641

    【讨论】:

      【解决方案3】:
      12345678       : 101111000110000101001110
      12345678 >> 2  : 1011110001100001010011
      12345678 / 4   : 1011110001100001010011
      

      【讨论】:

        【解决方案4】:

        在 i4gl 中,您可以轻松地将数字转换为 CHAR,将其截断 [1,6],然后将其转换回 INT。

        编辑:见Type conversion in i4gl

        【讨论】:

        • 赞成成为似乎真正解决 OP 问题的唯一答案 :)
        • 无需调用 cfunc,它可以在您的 .4gl 模块中完成。您在哪个版本的 i4gl 和平台上运行?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多