编一个二进制除法程序,大家帮忙

summerdog 2003-12-30 04:41:41
程序能求出一个二进制数除以3的余数,不能直接把二进制数化为十进制数来算,好象要把数移来移去弄一下的,大家给我个提示就行,谢谢拉
...全文
484 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
junnyfeng 2004-03-04
  • 打赏
  • 举报
回复
m
ZhangYv 2004-03-04
  • 打赏
  • 举报
回复
除法就是利用连续相减可以求得"商和模"
ZhangYv 2004-03-04
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2059/2059607.xml?temp=.6503565这是处理2进制的高精度加,减和乘法的C++程序.
/* Prositive HighPricistion—Operation of baniry system */
#include <iostream.h>
#include <mem.h>
const int MAXSIZE = 20; //max length of the number
const int K = 2; //baniry system 在这里可以修改K进制的高精度
class hp{
int len; //length of number
int s[MAXSIZE]; //store high precistion number
public:
hp();
hp hp::operator = (hp C);
};
hp::hp()
{
len = 0;
memset(s, 0, MAXSIZE*sizeof(int));
}
istream &operator >> (istream &in, hp &HP)
{
char s[MAXSIZE];
int i;
cout << "Input Number = ";
cin >> s;
HP.len = strlen(s);
for (i = 0; i < HP.len; i++)
HP.s[i] = s[HP.len-i-1] - '0'; //change string to high precisition
return in;
}
ostream &operator << (ostream &out, hp &HP)
{
int i;
for (i = HP.len-1; i >= 0; i--)
cout << HP.s[i];
return out;
}
hp operator +(hp A, hp B)
{
int i, len;
hp C;
if (A.len > B.len)
len = A.len;
else
len = B.len; //get the bigger length of A,B
for (i = 0; i < len; i++){
C.s[i] += A.s[i] + B.s[i];
if (C.s[i] >= K){
C.s[i] -= K;
++C.s[i+1]; //add 1 to a higher position
}
}
if (C.s[len] > 0)
C.len = len+1;
else
C.len = len;
return C;
}
hp operator - (hp A, hp B) //different of the two HighPrecision Numbers
{
int len, i;
hp C;
if (A.len > B.len)
len = A.len;
else
len = B.len;C.len = 4;
for (i = 0; i < len; i++){
C.s[i] += A.s[i] - B.s[i];
if (C.s[i] < 0){
C.s[i] += K;
--C.s[i+1]; //subtract 1 to higher position
}
}
while (C.s[len-1] == 0 && len > 1)
--len;
C.len = len;
return C;
}
hp operator * (const hp &A, const hp &B)
{
int len, i, j;
hp C;
for (i = 0; i < A.len; i++)
for (j = 0; j < B.len; j++){
len = i+j;
C.s[len] += A.s[i] * B.s[j];
C.s[len+1] += C.s[len] / K;
C.s[len] %= K;
}
len = A.len + B.len + 1;
/*
the product of a number with i digits and a number with j digits
can only have at most i+j+1 digits
*/
while (len > 1 && C.s[len-1] == 0)
--len;
C.len = len;
return C;
}
hp hp::operator = (hp C)
{
int i;
len = C.len;
for (i = 0; i < MAXSIZE; i++)
s[i] = C.s[i];
return *this;
}
int main()
{
hp A, B, C;
cin >> A >> B;
C = A+B;
cout << A << ‘+’ << B << “ = “ << C << endl;
C = A-B;
cout << A << ‘-’ << B << “ = “ << C << endl;
C = A*B;
cout << A << '*' << B << " = " << C << endl;
return 0;
}


herryhuang 2004-03-04
  • 打赏
  • 举报
回复
例如:111111
奇数位上3个1,偶数位上3个1,相减为0,因此原数111111除以三余0。

101010
奇数位上0个1,偶数位上3个1,相减为3,再次处理为0,所以原数除以三余0。
herryhuang 2004-03-04
  • 打赏
  • 举报
回复
奇数位上的1与偶数为上1相减,所得的数除以三的余数与原数除以三的余数相等。
dsy418 2004-03-04
  • 打赏
  • 举报
回复
数学有一个原理 判断一个数字是否是3的倍数只要看这个数每位加起来的和是否能被3整除
所以我们可以 先判断n的绝对值是否大于 10 如果大于10就累加个个位的数字赋值给 tol
再判断 tol是否大于10 如大于10就累加个个位的数字赋值给 tol 直到tol小于10 就判断tol 是否等于 3,6,9 就可以了。
tuxw 2003-12-30
  • 打赏
  • 举报
回复
这是个用位运算做的,不过我想不透这有什么用呢,用十进制算不是很简单吗:)
这是个字节相除的,可以进一步推广到其长度类型

int main()
{
unsigned char tt[] = { 0xc0, 0x90, 0x21, 0x81 };

unsigned char num=254, c;
int i, j;

c = num;
for( j=0; j<sizeof(tt)/sizeof(tt[0]); j++) {
for( i=0; i<((sizeof(c)<<3)-(j<<1)); i++ ) {
if( (c & tt[j]) == tt[j] ) {
c &= ~tt[j]; // 去掉符合条件的两位
}
tt[j] >>= 1;
}
}
printf("%d %% 3 = %d\n", num, c);

return 0;
}

原理是不断的减去3的倍数,找3的倍数时用了下面的规则

2^(n) + 2^(n+1) 是3的倍数,用数学归纳法很容易证明
由此推广到 2^(n)+2^(n+1+2k) 也是3的倍数

上面的规则在二进制上的表现就是:相隔偶数位的两位若都为1,则这两位的和为3的倍数
victor_cui 2003-12-30
  • 打赏
  • 举报
回复
可以用减法来模拟,首先看看结果是否大于3,如果大于3继续减,最后得到就是你要的结果

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧