如何使用位屏蔽从缓冲区访问6位

时间:2017-01-12 02:58:48

标签: c++

我们说我有一个缓冲区,我需要得到6位。缓冲区中一个元素的四个位和下一个元素的两个位。我想我知道如何从每个元素访问正确的位,但我不知道如何组合这些位。这是一些示例代码。

SELECT d.name
FROM users u
JOIN d IN u.devices
WHERE ST_DISTANCE(d.currentLocation, <user location>) < 500

2 个答案:

答案 0 :(得分:2)

我不确定你想要将这些位组合在一起,但也许你想要这样的东西:

unsigned char lastFourBits = (buffer[i] >> 4) & 0xF;         // 0000xxxx
unsigned char firstTwoBits = (buffer[i+1] & 0x3);            // 000000yy
unsigned char combined = (lastFourBits << 2) | firstTwoBits; // 00xxxxyy

或者:

unsigned char combined = (firstTwoBits << 4) | lastFourBits; // 00yyxxxx 

答案 1 :(得分:1)

您在此处执行的位移(buffer[i] >> 4)实际上正在丢失您想要的4位。 (buffer[i] & 0xF)将捕获第一个字节的低位四位。对于第二个字节,您希望两个高位[{1}}捕获这些字节。

连接:

(buffer[i+1] & 0xC0)

示例:如果数据流为0xABCD或1010 1011 1100 1101,则此等式捕获101111。