什么是12345>> 2真的算术吗?

时间:2012-07-13 18:26:22

标签: c bit-manipulation informix 4gl meter

我的问题在以下示例中val = val >> 2;做了什么?那是我相信它是4分裂。

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

以下是此问题的背景信息。

我有一个水表的读数,比如12345678.我们的水表的工作方式是两个右手数字被扔掉读取,所以123456真的是读。 (有理由丢掉与水流如何使寄存器转动有关的两个右手数字。但这与我的问题无关。)

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

在将读取截断为123456之后,使用上次读取(也是截断的)计算增量,并从中生成消耗。

我在Informix 4GL中可以使用C,我相信删除最低两位数的最佳方法是向右移位2.我相信这是我将获得的唯一方法 - 对于例子 -

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

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

4 个答案:

答案 0 :(得分:10)

比特移位丢弃最后两个二进制数字,而不是十进制数字。它相当于整数除以4。你需要除以100来抛弃最后两位小数。

101111000110000101001110 bin = 12345678 dec

101111000110000101001110 bin >> 2 dec = 1011110001100001010011 bin

1011110001100001010011 bin = 3086419 dec

答案 1 :(得分:4)

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

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

12345678 = 100101101011010000111

'>>'意味着你将每个位向右移动,在你的例子中,移动2个位置。 (<<向左移动)

100101101011010000111 >> 2 = 001001011010110100001

然后转换回十进制:308641

答案 2 :(得分:1)

12345678       : 101111000110000101001110
12345678 >> 2  : 1011110001100001010011
12345678 / 4   : 1011110001100001010011

答案 3 :(得分:1)

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

编辑:见Type conversion in i4gl