求解答,我想做一个输入二进制数返回十进制数的程序,出现了问题
vb吧
全部回复
仅看楼主
level 1
tzh654321 楼主
2020年05月05日 03点05分 1
level 1
tzh654321 楼主
这个十位数分离是没问题的
2020年05月05日 03点05分 2
level 15
说几点意见:
取出一个数的某一位不需要这么麻烦,比如取十位数,这样写就可以:
a \ 10 Mod 10
前面除以10(注意斜线的方向)表示去掉最后一位(除以10的几次方就是去掉几位),后面再对10取余就表示取出最后一位数
如果取的是最高位,最后的Mod 10就不需要写了
然后,二进制的表示一般不用数值类型,而是用字符串,就是说你不要用CDbl转换成数值型(其实为什么要转换成浮点数类型呢?为什么不CLng呢),那么也就不能用数值运算的方法取位数了,需要改用Mid函数取出从左边数的第n位:
Mid(a, n, 1)
2020年05月05日 05点05分 3
那么请问从右往左怎么说呢
2020年05月05日 05点05分
@tzh654321 其实没有从右往左的必要;如果要从右往左也很简单:For i = Len(a) To 1 Step -1
2020年05月05日 06点05分
level 7
十六进制是val("&H" & txt)
2020年05月05日 06点05分 4
level 1
tzh654321 楼主
为了适配7位以内的数,我补了0,这又是怎么回事
2020年05月05日 06点05分 5
谁让你CLng的,不要转换成数值
2020年05月05日 07点05分
@初音✨七奈 好吧,字符类型转换我还不是很懂
2020年05月05日 09点05分
level 1
tzh654321 楼主
‘问题都解决了’
dim r,s,ar,da,db,dc,dd,de,df,dg,n,m,z,y
z="0000000"
do
r=clng(inputbox("请输入二进制数"))
n=7-len(r)
m=right(z,n)
y=m&r
da=Mid(y,1, 1)
db=Mid(y,2, 1)
dc=Mid(y,3, 1)
dd=Mid(y,4, 1)
de=Mid(y,5, 1)
df=Mid(y,6, 1)
dg=Mid(y,7, 1)
if (da<>1 and da<>0)or(db<>1 and db<>0)or(dc<>1 and dc<>0)or(dd<>1 and dd<>0)or(de<>1 and de<>0)or(df<>1 and df<>0)or(dg<>1 and dg<>0) then
msgbox("啥,这是二进制???")
exit do
end if
'msgbox(dg&"~"&df&"~"&de&"~"&dd&"~"&dc&"~"&db&"~"&da)'此条测试用,去掉此行开头的'可以恢复测试
msgbox(64*da
+3
2*db+16*dc+8*dd+4*de+2*df+1*dg)
loop
2020年05月05日 09点05分 6
赞一下这种解决了问题回来说一声的人。
2020年05月05日 10点05分
1.要“适配7位”,n和m的那两步计算是没必要的,直接y=right("0000000" & r,7)就可以了。2.要检查输入的是否是“合法2进制”,没必要那么长1串if的逻辑算式,一个简单的For循环检查y的每一位是否为0或1就行了。3.采用“2.”的方案之后,就建议是“先检查合法性、再分离每位的值”了。
2020年05月05日 12点05分
按楼主的代码,如果输入的“二进制数”超过7位,n值为负数,在计算m值时肯定会“运行错误”。[滑稽][滑稽][滑稽] 但是按我上面“1.”所说那样取数,至少不会有这个运行错误。当然对“故意”搞怪来说,还是不完善的,比如输入“5个1”后面再按几个空格,应该处理为“5个1”;而按目前的代码将判断为“不合法”。
2020年05月05日 12点05分
2020年05月16日 14点05分
1