<%
a=01101110'八位2进制数,随便改
b=Len(a)
m=0
For i = -b to -1
d=mid(a,i+b+1,1)
c=(d*2)^(abs(i)-1)
If (abs(i)=1) And (d=0) Then'因为0^0为1,但实际我们需要0
response.write c-1&"="
elseif abs(i)=1 Then
response.write c&"="
Else
response.write c&"+"
End if
If (abs(i)=1) And (d=0) Then'这个是运算结果用的,是一样的,我们需要0,多了一个1,键去它
m=m+c-1
Else
m=m+c
End If
next
response.write (m)
%>
这是一个2进制转十进制的代码
一开始老出现错误,发现
Mid()和Len()函数只有在左起不为零的一位数才开始算第一位,依次类推Left()与Right()也应该如此
进行更正后,第一个Mid(a,1,1)就不是第八位了,不过影响不大
自己总结得出进制某位数大小
应为其值乘以进制值的位数减一次方
比如十进制
10二位
进制值为10
那么十进制转十进制就为
1*(10^(2-1))其他位数均为如此
比如111
就是1*100+1*10+1*1
100是(10^(3-1))等等
二进制001就是
0*4+0*0+1*1
根据这个编出上面的算法
但是遇到了问题
我们的循环是位数从高到低
但是Mid()取出的值是从左算起
找了半天发现循环不能同时提两个条件
比如
for i=-6 to -1:m=1 to 6
就不行
结果还是根据一个简单的加法
i+b+1
i在一直变小,那么整个结果就一直增大,就解决位数值与位数方向相反的问题了
(因为越往左位数越大,但是 Mid()是从左开始取的
i只能一个既要满足位数的方次不断编小,还要满足mid()里不断变大来实现一直向右伸展)
下面发现0^0竟然为1
也就是二进制第一位是0时
(0*2)(1-1)
就为1,但实际为零
所以编了if条件实现特殊情况特殊处理
最后就是连加的问题
我一直想不出怎么实现在循环语句累计连加
如果m=c+c那么是很可怕的
而且不能连加,c会每次都被重新赋值
但是我想到m可以实现
每次m被赋值是累计的,他不属于循环变量
那么一开始m=0
第一次循环m=+mc=0+64
第二次循环就m=64了 m=m+c=64+32
就这样实现连加
还有我给m赋值是在循环语句之外,这样在循环结束时
就可以在流程外输出连加最总值
你不信可以放进循环里看看
他就成了局部变量而不是全局变量
![]() | 回复:[原创]ASP心得集 | |
其实我编麻烦了 当时也许昏头了 不要什么If条件 因为 c=(d*2)^(abs(i)-1) 有问题 应该是 c=d*2^(abs(i)-1) 那么只要一个If判断末尾不用+而是=就可以了 简化后是 <% a=10100110 b=Len(a) m=0 For i = -b to -1 d=mid(a,i+b+1,1) c=d*2^(abs(i)-1) If abs(i)=1 Then response.write c&"=" Else response.write c&"+" End if m=m+c next response.write (m) %> 这样简单多了 |