Lua脚本32位数模拟64位乘除运算, 有符号的
m24h2020/01/29原创 软件综合 IP:上海
中文摘要
一个32位有符号数乘另一个32位有符号数减去一个32位有符号数
结果再除于一个32位有符号数
最终输出一个有符号的64位数和32位有符号的模
关键词
32位模拟64位

网上没有有效的代码可以抄

只好自己废脑细胞

这算法没啥难点, 就是复杂而已, 符号实现很麻烦

算法是在lua上的, 但是其他需要的地方也可以借鉴

算法是为了:

一个32位有符号数乘另一个32位有符号数减去一个32位有符号数

结果再除于一个32位有符号数

最终输出一个有符号的64位数和32位有符号的模

没有溢出或者精度丢失问题


--- for (a*b+c)/d, input signed 32bit, return signed 64bit quotient and signed 32bit remainder as [low32, high32, remainder]

--- following lua remainder rule

function muldiv (a, b, c, d)

    assert(d~=0, "muldiv() divided by 0")


    --- a*b

    local t0, t1, t2, t3 = bit.rshift(a,16), XXXXXXnd(0xffff, a), bit.rshift(b,16), XXXXXXnd(0xffff, b)

    t0, t1, t2, t3 = t1*t3, t1*t2, t0*t3, t0*t2

    t0, t1 = XXXXXXnd(0xffff, t0), bit.rshift(t0,16)+t1+XXXXXXnd(0xffff, t2)

    t0, t3 = t0 + XXXXXXhift(t1, 16), t3+bit.rshift(t1,16)+bit.rshift(t2,16)

    if (a<0) then t3 = t3-b end

    if (b<0) then t3 = t3-a end


    --- +c

    if (c>0) then

        if (t0<0) then

            t0 = t0+c

            if (t0>=0) then t3=t3+1 end

        else

            t0 = t0+c

        end

    else

        if (t0>=0) then

            t0 = t0+c

            if (t0<0) then t3=t3-1 end

        else

            t0 = t0+c

        end

    end


    --- /d

    local s1, s2 = false, false

    if (d<0) then 

        d = -d

        s1 = true

    end

    if (t3<0) then

        t0 = -t0

        t3 = -t3 - 1

        s2 = true

    end

    

    t2=0

    for t1=1,32 do

        t2 = XXXXXXhift(t2, 1) + bit.rshift(t3, 31)

        t3 = XXXXXXhift(t3, 1)

        if (t2>=d or t2<0) then

            t2 = t2 - d

            t3 = t3 + 1

        end

    end    

    for t1=1,32 do

        t2 = XXXXXXhift(t2, 1) + bit.rshift(t0, 31)

        t0 = XXXXXXhift(t0, 1)

        if (t2>=d or t2<0) then

            t2 = t2 - d

            t0 = t0 + 1

        end

    end

        

    if (s1) then

        if (s2) then

            t2 = -t2

        else

            t0 = -t0

            t3 = -t3 - 1

            if (t2~=0) then

                t2 = t2 - d

                if (t0==0) then

                    t3 = t3 -1

                end

                t0 = t0 - 1

            end

        end   

    elseif (s2) then

        t0 = -t0

        t3 = -t3 - 1

        if (t2~=0) then

            t2 = d - t2

            if (t0==0) then

                t3 = t3 -1

            end

            t0 = t0 - 1

         end

    end


    return t0, t3, t2

end


来自:计算机科学 / 软件综合
0
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
m24h
进士 学者 机友
文章
43
回复
767
学术分
1
2020/01/22注册,2时10分前活动

无聊地过着没有意义的日子 偶尔期待一点意思

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:上海
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}