如何查找二进制16位数的每个组合

问题描述 投票:-1回答:2

我的程序中有16个不同的选项,我有一个16个字符的变量,根据所选的选项填充1或0(0000000000000000表示没有选择,0010101010000101表示选项3,5,7,9,14和16已选中,1111111111111111表示已选择所有内容。)

当我运行我的程序时,代码看起来(使用if语句)为16位数字的指定字符中的1,如果有一个那么它运行该选项的代码,否则它跳过它..

例如,选项3看起来也看第3个字符(0010000000000000)是否为1,如果它是运行代码。

现在我要做的是生成一个可能的每个不同组合的列表,这样我就可以为它创建一个选项来循环并运行每个可能的选项:

0000000000000001 0000000000000010 0000000000000011 ... 1111111111111100 1111111111111110 1111111111111111

我试过这个,但我认为运行jaja可能需要几年时间:

    Dim binString As String

Dim binNUM As Decimal =“0.0000000000000001”

    Do Until binNUM = 0.11111111111111111
        binString = binNUM.ToString
        If binString.Contains(1) Then
            If binString.Contains(2) Or binString.Contains(3) Or binString.Contains(4) Or binString.Contains(5) Or binString.Contains(6) Or binString.Contains(7) Or binString.Contains(8) Or binString.Contains(9) Then

            Else
                Debug.Print(binNUM)
            End If
        End If

        binNUM = binNUM + 0.0000000000000001

在上面的代码完成之后,我将获取输出列表并删除任何“0”的实例。然后任何少于16个chararcters的行(因为最后一个字符将是0而不显示)我会添加一个0直到有16个字符。我知道这一点可能是愚蠢的,但它远远超过了我

有没有更快的方法我可以在VB.net中生成这样的列表?

vb.net
2个回答
1
投票

您应该能够使用Convert.ToString获取列表,如下所示:

Dim sb As New System.Text.StringBuilder

For i As Integer = 0 To 65535
    sb.AppendLine(Convert.ToString(i, 2).PadLeft(16, "0"c))
Next

Debug.Print(sb.ToString())

BTW:这应该在一秒钟内完成,具体取决于您的系统;-)


0
投票

使用enum创建一个FlagAttributes,它允许您执行列出的关键功能。这是一个在我正在进行的小项目中设置它的示例:

<FlagsAttribute>
Public Enum MyFlags As Integer
    None = 0
    One = 1
    Two = 2
    Three = 4
    Four = 8
    Five = 16
    Recon = 32
    Saboteur = 64
    Mine = 128
    Headquarters = 256
End Enum

EG

Dim temp as MyFlags
Dim doesIt as Boolean
temp = MyFlags.One
doesIt = temp.HasFlag(MyFlags.Two)
temp = temp OR MyFlags.Three
'etc.

真正的优势是如何打印出来,如果你想要的东西不是0,1,而且更加人性化。

© www.soinside.com 2019 - 2024. All rights reserved.