找回密码
 加入
搜索
查看: 7106|回复: 10

[效率算法] 位运算能不能超过32位的

  [复制链接]
发表于 2011-7-2 17:18:47 | 显示全部楼层 |阅读模式
悬赏100金钱未解决
本帖最后由 tryhi 于 2011-7-2 19:55 编辑

比如说一百位与一百位的运算,不知行不行,自带提供的6个函数是一定要32位的运算


1、BitAnd
2、BitOR
3、BitXOR
4、BitNot
5、BitShift
6、BitRotate

发表于 2011-7-2 19:01:40 | 显示全部楼层
利用数组分段处理如何,我写过一个大数阶乘的代码,可以支持电脑能撑得起的大数字的阶乘,就是采用数组8位一处理的。
目前最大测试过1到5000的阶乘,超级天文数字。

评分

参与人数 1金钱 +30 贡献 +5 收起 理由
tryhi + 30 + 5 感谢关注

查看全部评分

 楼主| 发表于 2011-7-2 19:54:44 | 显示全部楼层
回复 2# kevinch

能否看一下
发表于 2011-7-2 21:14:38 | 显示全部楼层
是vba的,等我转成au3的
发表于 2011-7-2 21:19:16 | 显示全部楼层
以下内容纯属蛋疼,本着宁滥毋缺的精神.
仅64位异或,无容错!
勿喷.
#INCLUDE <WINAPIex.AU3>

$Int_A=Int('0x1111111122222222')
$Int_B=int('0x3333333344444444')
MSGBOX(0,0,__BitXOR($Int_A,$Int_B))

Func __BitXOR($val1,$val2)
        $val164_Hi=_WinAPI_HiDWord($val1)
        $val164_Lo=_WinAPI_LoDWord($val1)
        
        $val264_Hi=_WinAPI_HiDWord($val2)
        $val264_Lo=_WinAPI_LoDWord($val2)

        $temp_Hi=BitXOR($val164_Hi,$val264_Hi)
        $temp_Lo=BitXOR($val164_Lo,$val264_Lo)

        Return "0x"&Hex($temp_Hi)&Hex($temp_Lo)
EndFunc

评分

参与人数 1金钱 +30 贡献 +5 收起 理由
tryhi + 30 + 5 感谢!

查看全部评分

 楼主| 发表于 2011-7-2 21:27:25 | 显示全部楼层
回复 5# 3mile

64位分两次计算,看来直接计算可能是不行了。。。。
发表于 2011-7-2 21:43:02 | 显示全部楼层
Local $a_Arr[1]

$i_N=InputBox("Input","Please input a number:")
If @error Then Exit 0
$a_Arr[0]=1
$i_O=0
For $i_I= 2 To $i_N
        For $i_T=0 To UBound($a_Arr)-1
                If Number($a_Arr[$i_T])=0 then
                        $a_Arr[$i_T]="00000000"
                Else
                        $a_Arr[$i_T]=String(Number($a_Arr[$i_T])*$i_I+$i_O)
                        $i_O=0
                        If StringLen($a_Arr[$i_T])>8 Then
                                $i_O=Number(StringLeft($a_Arr[$i_T],stringlen($a_Arr[$i_T])-8))
                                $a_Arr[$i_T]=StringRight($a_Arr[$i_T],8)
                        EndIf
                        If $i_T=UBound($a_Arr)-1 And $i_O<>0 Then
                                ReDim $a_Arr[UBound($a_Arr)+1]
                                $a_Arr[UBound($a_Arr)-1]=$i_O
                                $i_O=0
                        EndIf
                EndIf
        Next
Next
$s_Str=""
For $i_T=UBound($a_Arr)-1 To 0 Step -1
        $s_Str=$s_Str&String($a_Arr[$i_T])
Next
MsgBox(0,"Result:",$s_Str)
改好了,未经严格测试,希望能对你有所帮助。

评分

参与人数 1金钱 +20 贡献 +5 收起 理由
tryhi + 20 + 5 学习了

查看全部评分

 楼主| 发表于 2011-7-3 02:08:26 | 显示全部楼层
利用数组分段处理如何,我写过一个大数阶乘的代码,可以支持电脑能撑得起的大数字的阶乘,就是采用数组8位一 ...
kevinch 发表于 2011-7-2 19:01



    原来自身的计算只能计算到62阶乘,你这个5000以上都没问题,学习了。



不过似乎不能解决我问题,但确实学习到了
发表于 2011-7-3 03:19:13 | 显示全部楼层
并不是不能运算,而是计算结果的输出问题.
例如7#用的MsgBox(0,"Result:",$s_Str)
使用这种字符组合的方式,如果StringLen($s_Str) > 2^31-1,将会出现错误.
所以,如果一定要用10进制的话应该要学会使用指数表示.
发表于 2011-7-3 09:03:31 | 显示全部楼层
并不是不能运算,而是计算结果的输出问题.
例如7#用的MsgBox(0,"Result:",$s_Str)
使用这种字符组合的方式 ...
ceoguang 发表于 2011-7-3 03:19

多谢指教,当时写这个程序的目标是500的阶乘,因为有朋友出题给我,让我计算结果有多少个0,我数学超级滥,于是只能编程来弄,不过最终我测试了5000的,结果与朋友给的公式结果一致。不过看了您所提出的问题,确实想到,当阶乘的被乘数大到一定程度时确实会出现再次超出限制的情况,看来只能将被乘数也进行判断及分段处理或逐位处理,这样的处理方式就有点类似我写过的另一个将超大16进制数转为10进制数的程序啦。
发表于 2011-7-3 12:36:58 | 显示全部楼层
其实可以调用一下dll... 比如gmp库... 我好像发过帖子
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-14 14:15 , Processed in 0.096944 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表