我需要创建一个用C语言实现的算法,用于在任意数量的字节和一个字节之间进行模算术运算。请参考以下内容:
typedef struct{
u_int8_t * data;
u_int16_t length;
}UBigInt;
u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){
}
对于2的幂次方,可以使用a&(b-1),但是对于非2的幂次方呢?
我知道一种方法是:a - b*(a/b)
这需要使用UBigIntDivisionWithUInt8、UBigIntMultiplicationWithUInt8和UBigIntSubtractionWithUBigInt。可能有更有效的方法来做到这一点吗?
谢谢。
这是我现在的实现:
u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){
if (!(b & (b - 1)))
return a.data[a.length - 1] & b - 1; // For powers of two this can be done
// Wasn't a power of two.
u_int16_t result = 0; // Prevents overflow in calculations
for(int x = 0; x < a.length; x++) {
result *= (256 % b);
result %= b;
result += a.data[x] % b;
result %= b;
}
return result;
}
a
是任意字节数;那么你能说出关于b
的什么吗?它是常数吗?如果是,它的值是多少? - violet313b=0
的检查(当 b = 0 时,!(b&(b-1)) 为真,所以你在除以 256),而且作为美观的特性,你可以将b - 1
放在括号中。在我查看了 C 的运算符优先级表之前,这让我感到紧张。 - K.Steff