使用按位运算符

时间:2018-12-21 14:12:16

标签: c++ bitwise-operators

我正在Windows平台上使用C ++应用程序。有一个无符号字符指针,它以十进制格式获取字节。

unsigned char array[160];

它将具有这样的值

array[0] = 0
array[1] = 0
array[2] = 176
array[3] = 52

array[4] = 0
array[5] = 0
array[6] = 223
array[7] = 78

array[8] = 0
array[9] = 0
array[10] = 123
array[11] = 39

array[12] = 0
array[13] = 0
array[14] = 172
array[15] = 51

.......
........
.........
and so forth...

我需要占用4字节的每个块,然后计算其十进制值。

例如,对于第一个4个字节,组合的十六进制值为B034。现在我需要将其转换为十进制并除以1000。

如您所见,对于每个4字节块,第一个2字节始终为0。因此我可以忽略这些字节,然后使用该块的最后2个字节。因此,在上面的示例中,是176和52。

有很多方法可以做到这一点,但是我想通过使用按位运算符来做到这一点。

下面是我尝试过的方法,但是没有用。基本上是忽略每4个字节块的第一个2个字节。

int index = 0

for (int i = 0 ; i <= 160; i++) {
        index++;
        index++;
        float Val =  ((Array[index]<<8)+Array[index+1])/1000.0f;

        index++;
    }

2 个答案:

答案 0 :(得分:1)

由于您要四乘四处理数组,因此建议您在for循环中将i递增4。在删除不必要的index变量后,您还可以避免混淆-您在循环中有i,可以直接使用它,不是吗?

另一件事:当试图“连接”数字时,尽管它们的结果相同,但还是优先考虑按位或运算。

for (int i = 0 ; i <= 160; i += 4) {
    float val = ((array[i + 2] << 8) | array[i + 3]) / 1000.0f;
}

答案 1 :(得分:1)

首先,i <= 160一次迭代太多。

第二,您的加法错误;对于index,您有

Iteration 1:
    1, 2, 3
    And you're combining 2 and 3 - this is correct.
Iteration 2:
    4, 5, 6
    And you're combining 5 and 6 - should be 6 and 7.
Iteration 3:
    7, 8, 9
    And you're combining 8 and 9 - should be 10 and 11.

您每次迭代需要增加四次,而不是三次。

但是我认为从您感兴趣的第一个索引开始循环-2-然后直接增加4(即“跨度”)会更简单:

for (int i = 2; i < 160; i += 4) {
    float Val = ((Array[i]<<8)+Array[i+1])/1000.0f;
}