我正在编写一个程序,用一µC接收一堆0和1,并且需要从任何位置取任意数量的位(1到16)。

即我有150位,我想从第32位中取6位,然后将其复制到char(8bits)变量中;我知道我可以通过将字符串另存为ASCII 0和1来处理字符串,但是我没有太多RAM,因此需要将其另存为位。

较大的变量是32位无符号长,但是保存数据不是我的问题,问题是如何访问特定的位位置并将其复制到char(8)变量。

最佳答案

您可以使用按位运算符:

//bits: your bits (byte array), start: index of the first bit of the char you want
char select(char* bits, int start) {
    dec = start%8;
    return bits[start/8]>>dec + bits[start/8+1]<<dec;
}


上面的代码假定开始
[编辑]
您可以将char *更改为所需的任何类型。但是,您需要将dec值更改为适当的位数(8 * SIZE_IN_BYTES),然后应用运算符|。 (“逻辑或”)取回您的字符

例:

char select(int* bits, int start) {
    nbitsint = 8*4;
    dec = start%nbitsint;
    if (dec < nbitsint-8) {
       // | 0xff creates creates a byte
        return (bits[start/nbitsint]>>((3-dec/8)*8+dec%8) | 0xff;
    }
    // Getting a byte which is astride two values is tricky
    return (bits[start/nbitsint]>>(start%8) + bits[start/nbitsint+1]<<(start%8) | 0xff;
}

关于c - 如何用微 Controller 处理一堆0和1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38308992/

10-11 21:46