【发布时间】: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