社区
C语言
帖子详情
怎样用两个32位数,来实现64位的乘除运算?
常
2008-04-29 09:46:46
题目:只能用int 或 usigned int 型数据, 不能用浮点数,
请计算实现整数运算 a*b/c, (a,b,c都是非常大的32位整数)
思路:用32位来模拟64位的加减乘除,可能是一个能够保证计算精度的好方法。
请老师指点,如何实现?
...全文
986
9
打赏
收藏
怎样用两个32位数,来实现64位的乘除运算?
题目:只能用int 或 usigned int 型数据, 不能用浮点数, 请计算实现整数运算 a*b/c, (a,b,c都是非常大的32位整数) 思路:用32位来模拟64位的加减乘除,可能是一个能够保证计算精度的好方法。 请老师指点,如何实现?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
UltraBejing
2008-04-30
打赏
举报
回复
好像没那么简单,呵呵.
常
2008-04-29
打赏
举报
回复
if((x | t) > = z) { x -= z; y++; }
常
2008-04-29
打赏
举报
回复
重传一下
// 进行长除法(被除数为64位)
for (int i = 1; i <= 32; i++)
{
t = (int)x > > 31; // All 1 's if x(31) = 1.
x = (x < < 1) | (y > > 31); // Shift x || y left
y < <= 1; // one bit.
if((x|t) > = z) { x -= z; y++; }
}
return x; // y为商, x为余数
常
2008-04-29
打赏
举报
回复
我看到了一段代码挺好的,能实现 a*b/c的功能,
乘法做的是对的,但是除法做的好像不对,
那位老师帮着修正一下
// 计算(u*v)%m
unsigned mul_mod(unsigned u, unsigned v, unsigned z)
{
// 如果u*v没有溢出, 则直接计算
if((u*v)/u == v) return (u*v)%z;
// 进行长乘法(结果为64位)
unsigned u0, v0, w0;
unsigned u1, v1, w1, w2, t;
u0 = u & 0xFFFF; u1 = u > > 16;
v0 = v & 0xFFFF; v1 = v > > 16;
w0 = u0*v0;
t = u1*v0 + (w0 > > 16);
w1 = t & 0xFFFF;
w2 = t > > 16;
w1 = u0*v1 + w1;
// x为高32位, y为低32位
unsigned x = u1*v1 + w2 + (w1 > > 16);
unsigned y = u*v;
// 进行长除法(被除数为64位)
for (int i = 1; i <= 32; i++)
{
t = (int)x > > 31; // All 1 's if x(31) = 1.
x = (x < < 1) | (y > > 31); // Shift x || y left
y < <= 1; // one bit.
if((x|t) > = z) { x -= z; y++; }
}
return x; // y为商, x为余数
}
珍惜生命远离CPP
2008-04-29
打赏
举报
回复
大数运算,支持任意长度的 + - * / %
http://blog.csdn.net/akirya/archive/2008/02/04/2083998.aspx
用户 昵称
2008-04-29
打赏
举报
回复
直接在网上找大数运算之类的类 吧。
Xuon
2008-04-29
打赏
举报
回复
考虑用数组 看行不
晨星
2008-04-29
打赏
举报
回复
想办法手工处理一个进位和借位就是了。
珍惜生命远离CPP
2008-04-29
打赏
举报
回复
能内嵌汇编不能?
C语言
32位
和
64位
数
之间 位
数
的加减乘
除运算
#ifndef __INC_PUBLHEAD_H__ #define __INC_PUBLHEAD_H__ //----------------------------------------------------------------------------- #include <stdio.h> #include "PublType.h" //-------------...
bit64 -
32位
系统上对
64位
数
据的基本算术运算和逻辑运算
bit64运算在
64位
系统中可由硬件直接支持,但在
32位
系统中必须依赖软件模拟。本文介绍一种高效的软件
实现
方案,将
64位
数
据拆分为高低
32位
,通过多步指令协同完成基本算术与逻辑运算,确保跨平台兼容性。
位和位运算(
32位
和
64位
)
32位
的CPU,虽然在代码里放了个int64的
数
值,但实际上CPU的寄存器根本放不下这么大的
数
据,因此最简单的方法是,将int64的
数
值,拆成前后两半,现在
两个
int64相加,就变成了4个int32的
数
值相加,并且后半部分加好了之后,拿到进位,才能去计算前面的部分,这里光是执行的指令
数
就比
64位
的CPU要多。当你对 -1(即 ^int64(0) 的结果)进行右移 63 位的操作时,由于 -1 是负
数
,其符号位是 1,算术右移会在左边填充 1,因此无论你移动多少位,结果都是 -1。左移运算的符号是
彻底搞清楚Java的位运算(位
实现
加减乘除)
目录 •写在前面 •机器
数
和机器
数
的真值 •原码、反码和补码的基础概念和计算方法 原码 反码 补码 •java中的运算符 •不用乘除算乘除 加法 减法 乘法 除法 •写在前面 二进制位运算是最贴近计算机真实运算操作,通过位运算,我们可以高效的完成各种基础运算(加减乘除取余等),我们还可以使用位运算巧妙的完成原本很复杂的工作,真正理解计算机,我们才能更好的使用计算机。在这...
MATALB大
数
的加减乘除幂运算
大
数
(超过计算机最大处理类型位
数
)的加、减、乘、除、幂等的MATLAB计算方法。 最近需要做大
数
计算,且要求结果精度与原始
数
据一致(不能使用科学计
数
等近似解)。所以总结分享一些“超大正整
数
的基本运算方法”,如加、减、乘、除、幂等
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章