我必须执行此程序,我必须使用一个长度在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);