GF[2^n]下的多项式除法

//n<=15时的多项式除法,要求 被除数次数>=除数次数
#include <stdio.h>

typedef unsigned char U8;
typedef char S8;
typedef unsigned short U16;

S8 getHigh(U16 num)//获取最高位的次数
{
	int i = 15;
	for(; i>=0; i--)
	{
		if( (U16)(num>>i) )
			return i;
	}
	return -1;
}

U16 div_2n(U16 dividend, U16 divisor)
{
	U16 quotient = 0;
	U8 divisor_h;
	S8 diff;

	divisor_h = getHigh(divisor);
	diff = getHigh(dividend) - divisor_h;
	while(diff>=0)//被除数次数 >= 除数次数
	{
		quotient |= (U16)(1<<diff);//商
		if(diff)//存在余
			dividend = ( dividend ^ (U16)(divisor<<diff) ) | 
			(U16)( (U16)(dividend<<(16-diff)) >>  (16-diff));//余数,作为下一步的被除数
		else
			break;//退出
		diff = getHigh(dividend) - divisor_h;
	}
	
	return quotient;
}


int main()
{
	printf("%X\r\n", div_2n(0x35, 0xB));// 110101/1011
	printf("%X\r\n", div_2n(0x3F, 0xB));// 111111/1011
	return 0;
}


输出结果:

7
6
请按任意键继续. . .


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值