使用位运算符

问题描述 投票:0回答:2

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

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++;
    }
c++ bitwise-operators
2个回答
1
投票

由于您要对数组进行4×4处理,因此我建议您在for循环中将i增加4。删除不必要的index变量后,你也可以避免混淆 - 你在循环中有i并且可以直接使用它,不是吗?

另一件事:当你试图“连接”数字时,首选按位OR或算术加法,尽管它们的结果是相同的。

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

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(“stride”):

for (int i = 2; i < 160; i += 4) {
    float Val = ((Array[i]<<8)+Array[i+1])/1000.0f;
}
© www.soinside.com 2019 - 2024. All rights reserved.