C语言对于字节位判断

c语言环境下
有一串8位的数组
例如:

0x55 0x00 0x4F 0x07 0x00 0x00 0x00 0x5C

转换为二进制就是

101010100000000010011110000011100000000000000000000000001011100

协议文档写明数据从低位到高位开始解析,从右往左
比如说第0位和第1位这两位数据表示传感器A的状态
第3位表示传感器B的状态
第4位和第5位又是两位来表示传感器C的状态
第五位第六位表示传感器D的状态
然后第7位又表示传感器N的状态
每一个传感器状态占用的位数不定,可能有的占一位,有的占两位

我想实现一个函数,传入这串数组,转换二进制后然后开始分析,
比如说传感器A 占用第0位开始2位,分别代表 开(01)、关(11)、停止(10)
传感器B占用第2位开始1位,分别是开(1)、关(0)
传感器C、D、E、F以此类推
传入数据,然后printf打印出每个传感器的状态

小生学艺不才,特来询问各位老 师,小生在此谢过各位老 师~


#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#pragma warning(disable:4996)

void GetStatus(unsigned char* status)
{
    long long allStatus = 0;
    int i = 0;
    char* sensorStatus = (char*)calloc(10, sizeof(char));

    for (; i < 8; i++)
    {
        allStatus |= (long long)status[7 - i] << i * 8;
    }

    switch (allStatus & 0x3)
    {
    case 1:
        strcpy(sensorStatus, "开");
        break;
    case 2:
        strcpy(sensorStatus, "停止");
        break;
    case 3:
        strcpy(sensorStatus, "关");
        break;
    default:
        strcpy(sensorStatus, "无此状态");
    }
    printf("传感器A为:%s\n", sensorStatus);

    switch ((allStatus & 0x4) >> 2)
    {
    case 1:
        strcpy(sensorStatus, "开");
        break;
    case 0:
        strcpy(sensorStatus, "关");
        break;
    default:
        strcpy(sensorStatus, "无此状态");
    }
    printf("传感器B为:%s\n", sensorStatus);
}

int main()
{
    unsigned char status[8] = { 0x55,0x00,0x4f,0x07,0x00,0x00,0x00,0x5c };
    GetStatus(status);

}

img