求:特殊二进制数的产生算法

lhhz 2005-11-19 05:02:29
如第1-16个数分别为二进制0000-1111
第17-32为0000,0000-0000,1111
第33-48为0001,0000-0001,1111
第49-64为0010,0000-0010,1111
以此类推(注:四位的共16个,八位的工16*16,十二位的共16*16*16......)
若任意给出一个数的序号(即第N个数)
求该数的二进制表示?
...全文
264 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhhz 2005-11-21
  • 打赏
  • 举报
回复
Thanks
northwolves(狼行天下)
能不能把你中间的过程稍微解释下
把思路说下,不是看的很明白
northwolves 2005-11-21
  • 打赏
  • 举报
回复
利用等比数列求和公式计算:

Function tob(ByVal n As Long) As String
Dim a() As String, temp As Long, i As Long
temp = Int(Log(n * 15 + 15) / Log(16))
n = n - 1 - (16 ^ temp - 16) / 15
temp = 5 * temp - 1
ReDim a(1 To temp)
For i = temp To 1 Step -1
If i Mod 5 = 0 Then
a(i) = ","
Else
a(i) = n Mod 2
n = n \ 2
End If
Next
tob = Join(a, "")
End Function
lhhz 2005-11-20
  • 打赏
  • 举报
回复
举个简单点的例子就是
产生如下的二进制数:0/1/00/01/10/11/000/001/010/011/100/101/110/111/0000/0001.....
,所有的数都是按上面这样的顺序排列,先是一个数字,然后两个数字,再是三个数字,四个....
如果最后需要的数是N位的
那么总共的二进制数有S=1+2^1+2^2+2^3+...+2^N
我想找到一个根据数是第M个来求这个数具体是什么样的(即二进制表示)
通常我们二进制表示是所有的数的位数是一样的,但是这里我想得到有些不同。
lhhz 2005-11-20
  • 打赏
  • 举报
回复
谢谢楼上的那位朋友
呵呵
我测试了下,发现当X=17时,你的代码出来的结果是0001,0000
而我需要的是0000,0000
northwolves 2005-11-20
  • 打赏
  • 举报
回复
你的要求前后不一致。后者更简单一些:

Option Explicit

Private Sub Command1_Click() '随机测试
Dim x As Long
Randomize
x = Int(Rnd * 100000)
MsgBox x & " --->" & tob(x)
End Sub

Function tob(ByVal n As Long) As String
Dim a() As String, i As Long, temp As Long
n = n - 1
temp = 5 * (Int(Log(n) / Log(2)) \ 4 + 1) - 1
ReDim a(1 To temp)
For i = temp To 1 Step -1
If i Mod 5 = 0 Then
a(i) = ","
Else
a(i) = n Mod 2
n = n \ 2
End If
Next
tob = Join(a, "")
Erase a
End Function
lhhz 2005-11-20
  • 打赏
  • 举报
回复
northwolves(狼行天下)
你的理解没错
不过,在只有因为数组有上下边界限制
我希望在程序运行过程中能动态产生我需要的当前的一个
而不是把所有的一起产生
你的代码能否扩展到开始我一开始所说的那样
第1-16为0000-1111
第17-32为0000,0000-0000,1111
第33-48为0001,0000-0001,1111
第49-64为0010,0000-0010,1111
以此类推(注:四位的共16个,八位的工16*16,十二位的共16*16*16......)
我要求得第N个数的表示方法
northwolves 2005-11-20
  • 打赏
  • 举报
回复
2^n-1 总是n 个0
northwolves 2005-11-20
  • 打赏
  • 举报
回复
不太明白楼主意思,看看理解对不对:

Option Explicit

Private Sub Command1_Click()
Dim i As Integer
For i = 1 To 100
Debug.Print i; ":"; tob(i)
Next
End Sub

Function tob(ByVal n As Long) As String
Dim a() As String, i As Long, temp As Long
temp = Int(Log(n + 1) / Log(2))
n = n + 1 - 2 ^ (temp)
ReDim a(1 To temp)
For i = temp To 1 Step -1
a(i) = n Mod 2
n = n \ 2
Next
tob = Join(a, "")
Erase a
End Function

返回:
1 :0
2 :1
3 :00
4 :01
5 :10
6 :11
7 :000
8 :001
9 :010
10 :011
11 :100
12 :101
13 :110
14 :111
15 :0000
16 :0001
17 :0010
18 :0011
19 :0100
20 :0101
21 :0110
22 :0111
23 :1000
24 :1001
25 :1010
26 :1011
27 :1100
28 :1101
29 :1110
30 :1111
31 :00000
32 :00001
33 :00010
34 :00011
35 :00100
36 :00101
37 :00110
38 :00111
39 :01000
40 :01001
41 :01010
42 :01011
43 :01100
44 :01101
45 :01110
46 :01111
47 :10000
48 :10001
49 :10010
50 :10011
51 :10100
52 :10101
53 :10110
54 :10111
55 :11000
56 :11001
57 :11010
58 :11011
59 :11100
60 :11101
61 :11110
62 :11111
63 :000000
64 :000001
65 :000010
66 :000011
67 :000100
68 :000101
69 :000110
70 :000111
71 :001000
72 :001001
73 :001010
74 :001011
75 :001100
76 :001101
77 :001110
78 :001111
79 :010000
80 :010001
81 :010010
82 :010011
83 :010100
84 :010101
85 :010110
86 :010111
87 :011000
88 :011001
89 :011010
90 :011011
91 :011100
92 :011101
93 :011110
94 :011111
95 :100000
96 :100001
97 :100010
98 :100011
99 :100100
100 :100101
truewill 2005-11-19
  • 打赏
  • 举报
回复
实在是看不懂你在说什么

用数组hardcode就好了

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧