求C语言写一段代码(关于除法)
根据:
2进制完成除法运算就是移位和相减,比如1011011除以1110顺序如下:
1 - 1110 不够减, 结果添0, 1左移一位再加上原来1后的0,为10
10 - 1110 不够减, 结果添0, 10左移一位再加上原来10后的1,为101
101 - 1110 不够减, 结果添0, 101左移一位再加上原来101后的1,为1011
1011 - 1110 不够减, 结果添0, 1011左移一位再加上原来1011后的0,为10110
10110 - 1110 = 1000 结果添1,同上左移加原来10110后的1得 10001
10001 - 1110 = 11 结果添1,同上左移加原来101101后的1得 111
111 - 1101 不够减,结果添0,此时1011011所有位都已移完,运算完毕
即 1011011 = 1110 * 0110 + 111
也即 91 = 14 * 6 + 7
由于你相除的两个数放在两个数组中,比如A[]与B[],要模拟这种运算的话就需要能不
断地从A中取出其二进制的高位,添加到一个当前值的数组C[]中,而实际进
行运算的就是C与B。数组单元的类型必然是多位的,你必须要实现做到对数组C[]左移
一位的操作,剩下的就是判断C够不够减B(即C数组的数是不是比B大)了。
至于左移,我想大家都想到了,其实C和B是倒序存放的,以数组单元为8位为例,
C[0]存放着C的最低8位,用表达式表示就是 C[0] = C & 0xff, C[1] = C & 0xff00, ...
这样当移位时,只要保留当前单元C[i]的最高位,即h = C[i] > > 7,然后直接对
C[i]左移一位即 C[i] < <1,然后再加上上一单元C[i-1]保留的最高位就得到当前的C[i]了。
对于C[0]来说,它的上一单元的最高位自然就是A的最高位了。
写一段代码:
要求:
1.被除数为64位的数(数组最小单位必须使用8bit)
2.除数为32位的数(同上)
3.需要得到的结果为商和余数
[解决办法]
记得linux里好像有源码啊__div64_32
[解决办法]
google 汇编的除法
[解决办法]
你自己已经说了,基于移位和减法,那就先实现这两个多位的移位和减法算法啦
[解决办法]
- C/C++ code
#include <string.h>#include <stdio.h>#define len1 (8) //长度可以调整#define len2 (4)/* * ncmp() * 比较*/int ncmp(unsigned char const *a, unsigned char const *b, int n){ int i; for (i = n - 1; i >= 0; i--) if (a[i] > b[i]) return 1; else if (a[i] < b[i]) return -1; if (i < 0) return 0;}/* * nsub() * 减法*/int nsub(unsigned char *a, unsigned char *b, int n){ int i, carry = 0; for ( i = 0; i < n; i++) { a[i] -= carry; if (a[i] < b[i]) { a[i] = 0xff - b[i] + 0x01 + a[i]; carry = 1; } else a[i] -= b[i]; } return 0;}/* * nshr() * 右移*/int nshr(unsigned char *a, int n){ int i; for (i = n - 1; i > 0; i--) { a[i] <<= 1; a[i] |= (a[i - 1] >> 7); } a[0] <<= 1;}/* * div() * 除法 * a[] 被除数, b[] 除数, c[] 商, 余数放回在a[]里 */int div(unsigned char a[], unsigned char b[], unsigned char c[]){ unsigned char x[len2]; int i, j; memset(x, 0, sizeof(x)); memset(c, 0, sizeof(unsigned char) * len1); for (i = 0; i < 8 * len1; i++) { nshr(x, len2); nshr(c, len1); x[0] |= (a[len1 - 1] >> 7); if (ncmp(x, b, len2) >= 0) { c[0] |= 1; nsub(x, b, len2); } nshr(a, len1); } memcpy(a, x, sizeof(x));}/* * main() * 简单测试 */int main(){ unsigned char a[8], b[8], c[8]; unsigned long long *a_l = (unsigned long long *)a; unsigned long long *b_l = (unsigned long long *)b; unsigned long long *c_l = (unsigned long long *)c; *a_l = 1124141234; *b_l = 123; div(a, b, c); printf("a = %ld\n", *a_l); printf("c = %ld\n", *c_l); return 0;}