3

我的问题是在下面的例子中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

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

4

4 回答 4

10

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

101111000110000101001110 bin = 12345678 dec

101111000110000101001110 bin >> 2 dec = 1011110001100001010011 bin

1011110001100001010011 bin = 3086419 dec

于 2012-07-13T18:28:51.700 回答
4

'>>' 执行按位移位操作。

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

12345678 = 100101101011010000111

'>>' 表示您将每个位向右移动,在您的示例中,移动 2 个位置。(<<向左移动)

100101101011010000111 >> 2 = 001001011010110100001

然后转换回十进制:308641

于 2012-07-13T18:36:18.217 回答
1
12345678       : 101111000110000101001110
12345678 >> 2  : 1011110001100001010011
12345678 / 4   : 1011110001100001010011
于 2012-07-13T18:38:06.340 回答
1

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

编辑:请参阅i4gl 中的类型转换

于 2012-07-14T00:28:19.647 回答