我必须执行此程序,我必须使用一个长度在1到20位之间的寄存器。我只能想到为此目的使用字符数组。
我想左移(减1),重置第n位,并根据条件设置或重置第0位。由于我直到运行时才知道位数,因此我正在使用malloc分配字符数组的大小。请告诉我这是否正确

// history bits can change from 1 to 20
int historyRegisterSize=(historybits+7)/8;

// allocating memory dynamically
historyRegister=malloc(historyRegisterSize * sizeof(unsigned char));

// Shifting left one bit
    unsigned char *byte;
    int size=historyRegisterSize;
    for( byte =historyRegister; size--; ++byte )
    {
        unsigned char bit = 0;
        if (size>=0)
        {
            bit = byte[1] & (1 << (8 - 1)) ? 1 : 0;
        }
        *byte <<= 1;
        *byte |= bit;
    }

    // Resetting the nth bit
    historyRegister[0]=historyRegister[0] & 0x7;

     // or should i use this one for resetting?
     //historyRegister[historyRegisterSize-1] &= ~(1 <<(historybits-1));

    // Setting the 0th bit based on a condition
    if(condition)
    {
        historyRegister[historyRegisterSize-1]=historyRegister[historyRegisterSize-1] | 1;
        // or should i use this statement below?
        //historyRegister[0] |= 1 <<0;
    }
    else
    {
    historyRegister[historyRegisterSize-1]=historyRegister[historyRegisterSize-1] & 0xfe;
      // or should i use this statement below?
      //historyRegister[0] &= ~(1 <<0);
    }


完成所有这些操作后,我想对我的字符数组(historyRegister)进行无符号的64位整数异或运算,并取其模数。为此,我正在使用此语句

// result and var2 and unsigned long variables
// and size is another unsigned integer.
result=(var1 ^ *(unsigned long int *)historyRegister) % size;


一切看起来都正确吗?我的问题是,当我更改字符数组中的位数时,输出值似乎在一个范围内保持恒定。那是从1到8位相同的O / P,从8到16然后是16到20。Endianness我会出错吗?

另外,还有使用字符数组的更好替代方法吗?

最佳答案

如果只需要存储20位,则使用unsigned int或long会更容易。
然后可以通过

val <<= 1;


您可以屏蔽掉最左边的位

val &= ((1u <<n) -1);

10-06 05:45