tryhi 发表于 2011-7-2 17:18:47

位运算能不能超过32位的

本帖最后由 tryhi 于 2011-7-2 19:55 编辑

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


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

kevinch 发表于 2011-7-2 19:01:40

利用数组分段处理如何,我写过一个大数阶乘的代码,可以支持电脑能撑得起的大数字的阶乘,就是采用数组8位一处理的。
目前最大测试过1到5000的阶乘,超级天文数字。

tryhi 发表于 2011-7-2 19:54:44

回复 2# kevinch

能否看一下

kevinch 发表于 2011-7-2 21:14:38

:face (36):是vba的,等我转成au3的

3mile 发表于 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

tryhi 发表于 2011-7-2 21:27:25

回复 5# 3mile

64位分两次计算,看来直接计算可能是不行了。。。。

kevinch 发表于 2011-7-2 21:43:02

Local $a_Arr

$i_N=InputBox("Input","Please input a number:")
If @error Then Exit 0
$a_Arr=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
                                $a_Arr=$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)改好了,未经严格测试,希望能对你有所帮助。

tryhi 发表于 2011-7-3 02:08:26

利用数组分段处理如何,我写过一个大数阶乘的代码,可以支持电脑能撑得起的大数字的阶乘,就是采用数组8位一 ...
kevinch 发表于 2011-7-2 19:01 http://www.autoitx.com/images/common/back.gif


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



不过似乎不能解决我问题,但确实学习到了

ceoguang 发表于 2011-7-3 03:19:13

并不是不能运算,而是计算结果的输出问题.
例如7#用的MsgBox(0,"Result:",$s_Str)
使用这种字符组合的方式,如果StringLen($s_Str) > 2^31-1,将会出现错误.
所以,如果一定要用10进制的话应该要学会使用指数表示.

kevinch 发表于 2011-7-3 09:03:31

并不是不能运算,而是计算结果的输出问题.
例如7#用的MsgBox(0,"Result:",$s_Str)
使用这种字符组合的方式 ...
ceoguang 发表于 2011-7-3 03:19 http://www.autoitx.com/images/common/back.gif
多谢指教,当时写这个程序的目标是500的阶乘,因为有朋友出题给我,让我计算结果有多少个0,我数学超级滥,于是只能编程来弄,不过最终我测试了5000的,结果与朋友给的公式结果一致。不过看了您所提出的问题,确实想到,当阶乘的被乘数大到一定程度时确实会出现再次超出限制的情况,看来只能将被乘数也进行判断及分段处理或逐位处理,这样的处理方式就有点类似我写过的另一个将超大16进制数转为10进制数的程序啦。

rolaka 发表于 2011-7-3 12:36:58

其实可以调用一下dll... 比如gmp库... 我好像发过帖子
页: [1]
查看完整版本: 位运算能不能超过32位的