Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带字节数组和8位整数的模算法:8位=字节%8位_C_Algorithm_Modulo - Fatal编程技术网

C 带字节数组和8位整数的模算法:8位=字节%8位

C 带字节数组和8位整数的模算法:8位=字节%8位,c,algorithm,modulo,C,Algorithm,Modulo,我需要创建一个用C实现的算法,在任意数量的字节和一个字节之间进行模运算。见此: typedef struct{ u_int8_t * data; u_int16_t length; }UBigInt; u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){ } 对于二次幂,可以使用a&(b-1),但对于非二次幂呢 我意识到一种方法是:a-b*(a/b) 这需要使用UbigintVision with uint8和Ubigi

我需要创建一个用C实现的算法,在任意数量的字节和一个字节之间进行模运算。见此:

typedef struct{
    u_int8_t * data;
    u_int16_t length;
}UBigInt;
u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){

}
对于二次幂,可以使用a&(b-1),但对于非二次幂呢

我意识到一种方法是:a-b*(a/b)

这需要使用UbigintVision with uint8和UbigintMultiplication with uint8以及UbigintSubtraction with Ubigint。有没有更有效的方法

多谢各位

这就是我现在的实现:

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;
}
u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){
如果(!(b和(b-1)))
返回a.data[a.length-1]&b-1;//对于2的幂,可以这样做
//不是二的幂。
u_int16_t result=0;//防止计算溢出
对于(int x=0;x
您可以使用霍纳方法的变体。
使用以下公式逐字节处理:
a%b=((a//256)%b)*(256%b)+(a%256)%b
,其中x//y是四舍五入除法(普通C整数除法)。这将起作用的原因是同余模b是一种等价关系。
这样你就有了一个
O(长度)
算法,或者
O(log(a))

示例代码段(未经测试,我的C语言技能已经过时):

u_int16_t result=0;//以防万一,防止溢出

对于(i=0,iyou说
a
是一个任意的字节数;如果你能对b说些什么呢?它是常数吗?如果是,值是什么?我认为
b
是一个任意的8位(无符号的?)integer.b可以是1-255。我需要为58实现它,但可能会有更多的情况。如果有专门针对58的优化解决方案,那么这将很好,但我可能需要为任何情况实现它。我想这是您不能/不想要的原因?~它内置了许多优化,甚至针对特定的处理器,就像那些为这类事情写这本书的人一样;)我看了看,觉得很头痛。:-)如果我能吃掉我所需要的零件,那就好了,但我无法绕过那个图书馆。在那个库或其他库中有我可以从中获取的代码吗?我发现了一个名为BigDigits的库,尽管它使用的是32位整数,而不是我想要的8位整数-(我不知道它是如何工作的,但从一个测试来看,它似乎是。我将实现它,并测试,然后返回给您。谢谢。谢谢,我用Python(本机支持任意大小的整数)测试了它,代码如下:在循环2分钟后,似乎没有给出任何错误,所以我想没问题;)请注意,我没有讨论零除,我添加了一个二次幂测试,修复了for循环,并给出了我的代码。
u_int16_t result = 0; // Just in case, to prevent overflow
for(i = 0, i<a.length; i++) {
    result *= (256 % b);
    result %= b;
    result += (a[i] % b);
    result %= b;
}