代码之家  ›  专栏  ›  技术社区  ›  HitmanHeathcote

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

  •  -1
  • HitmanHeathcote  · 技术社区  · 7 年前

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

    当我运行程序时,代码在16位数字的指定字符中查找(使用if语句)1,如果有1,则运行该选项的代码,否则跳过它。

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

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

    000000000000000 1个
    00000000000000十
    00000000000000十一

    11111111111 00
    111111111110
    1111111111111

    我试过了,但我想可能需要几年的时间来管理Jaja:

        Dim binString As String
    

    dim binnum as decimal=“0.000000000000000 1”

        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个字符的行(因为最后一个字符将是0而不显示)我将添加0,直到有16个字符为止。我知道这一点可能很愚蠢,但我知道

    在vb.net中有没有更快的方法生成这样的列表?

    2 回复  |  直到 7 年前
        1
  •  1
  •   MatSnow    7 年前

    你应该可以通过使用 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())
    

    顺便说一下:这应该在一秒钟内完成,这取决于您的系统;-)

        2
  •  0
  •   AJD    7 年前

    创建一个 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
    

    例如

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

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