Wie Zahl invertieren?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Wie Zahl invertieren?

    Ich möchte eine Zahl invertiert haben, also Binär wird aus einer 1 eine 0 und umgekehrt.

    Folgenden Code habe ich gefunden:

    C#-Quellcode

    1. public static int ZahlInvertieren2(int zahl)
    2. {
    3. int returnValue = 0;
    4. while (zahl != 0)
    5. {
    6. returnValue *= 10;
    7. returnValue += zahl % 10;
    8. zahl /= 10;
    9. }
    10. return returnValue;
    11. }


    Mit converter.telerik.com/ kommt folgender Fehler:

    VB.NET-Quellcode

    1. Public Shared Function ZahlInvertieren2(ByVal zahl As Integer) As Integer
    2. Dim returnValue As Integer = 0
    3. While zahl <> 0
    4. ''' Cannot convert ExpressionStatementSyntax, System.ArgumentOutOfRangeException: Exception of type 'System.ArgumentOutOfRangeException' was thrown.
    5. ''' Parameter name: op
    6. ''' Actual value was MultiplyAssignmentStatement.
    7. ''' at ICSharpCode.CodeConverter.Util.VBUtil.GetExpressionOperatorTokenKind(SyntaxKind op)
    8. ''' at ICSharpCode.CodeConverter.VB.NodesVisitor.MakeAssignmentStatement(AssignmentExpressionSyntax node)
    9. ''' at ICSharpCode.CodeConverter.VB.NodesVisitor.VisitAssignmentExpression(AssignmentExpressionSyntax node)
    10. ''' at Microsoft.CodeAnalysis.CSharp.Syntax.AssignmentExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
    11. ''' at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
    12. ''' at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
    13. ''' at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitAssignmentExpression(AssignmentExpressionSyntax node)
    14. ''' at Microsoft.CodeAnalysis.CSharp.Syntax.AssignmentExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
    15. ''' at ICSharpCode.CodeConverter.VB.MethodBodyVisitor.ConvertSingleExpression(ExpressionSyntax node)
    16. ''' at ICSharpCode.CodeConverter.VB.MethodBodyVisitor.VisitExpressionStatement(ExpressionStatementSyntax node)
    17. ''' at Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionStatementSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
    18. ''' at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
    19. ''' at ICSharpCode.CodeConverter.VB.CommentConvertingMethodBodyVisitor.ConvertWithTrivia(SyntaxNode node)
    20. ''' at ICSharpCode.CodeConverter.VB.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node)
    21. '''
    22. ''' Input:
    23. ''' returnValue *= 10;
    24. '''
    25. returnValue += zahl Mod 10
    26. ''' Cannot convert ExpressionStatementSyntax, System.ArgumentOutOfRangeException: Exception of type 'System.ArgumentOutOfRangeException' was thrown.
    27. ''' Parameter name: op
    28. ''' Actual value was DivideAssignmentStatement.
    29. ''' at ICSharpCode.CodeConverter.Util.VBUtil.GetExpressionOperatorTokenKind(SyntaxKind op)
    30. ''' at ICSharpCode.CodeConverter.VB.NodesVisitor.MakeAssignmentStatement(AssignmentExpressionSyntax node)
    31. ''' at ICSharpCode.CodeConverter.VB.NodesVisitor.VisitAssignmentExpression(AssignmentExpressionSyntax node)
    32. ''' at Microsoft.CodeAnalysis.CSharp.Syntax.AssignmentExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
    33. ''' at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
    34. ''' at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
    35. ''' at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitAssignmentExpression(AssignmentExpressionSyntax node)
    36. ''' at Microsoft.CodeAnalysis.CSharp.Syntax.AssignmentExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
    37. ''' at ICSharpCode.CodeConverter.VB.MethodBodyVisitor.ConvertSingleExpression(ExpressionSyntax node)
    38. ''' at ICSharpCode.CodeConverter.VB.MethodBodyVisitor.VisitExpressionStatement(ExpressionStatementSyntax node)
    39. ''' at Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionStatementSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
    40. ''' at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
    41. ''' at ICSharpCode.CodeConverter.VB.CommentConvertingMethodBodyVisitor.ConvertWithTrivia(SyntaxNode node)
    42. ''' at ICSharpCode.CodeConverter.VB.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node)
    43. '''
    44. ''' Input:
    45. ''' zahl /= 10;
    46. '''
    47. End While
    48. Return returnValue
    49. End Function


    Wie wäre der richtige VB.net Code?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Uh eventuell bin ich noch nicht ganz wach, aber gibt dir deine Methode bei Input 0 nicht 0 zurück, wegen dem while (zahl != 0).

    Ansonsten, warum so kompliziert, wenn es nur um 0 und 1 geht: return If(zahl == 0, 1, 0)
    da aber Not aus einer 0 eine 1 und aus einer 1 eine 0 macht, ist es der effizientere Weg, da man keinen weiteren Wert benötigt.
    Not 10110101 = 01001010. Abhängig von dem Zahlenraum kommen dann aber noch sehr viele Einsen vor dem gezeigten Wert, weil ja dem ursprünglichen Wert (unendlich) vielen Nullen vorangestellt sind.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Bei der XOr Methode haben beide Werte unendlich viele Nullen vorangestellt und damit hat auch das Ergebnis unendlich viele Nullen wieder vorangestellt.
    Not ist quasi And mit 0, dass man die Potenz also die Länge der Bitdarstellung berechnen muss ist quasi Pflicht in diesem Fall. Denn 01 ist halt nicht 1 in der Aufgabenstellung
    MyFault, @oobdoo. Du willst sie wohl nicht im gedachten Sinne invertieren, sondern die Ziffernreihenfolge umkehren, sodass aus 123 eben 321 und aus 123456789 eben 978654321 wird.

    VB.NET-Quellcode

    1. Shared Function ZahlInvertieren2(zahl As Integer) As Integer
    2. Dim returnValue = 0
    3. While zahl <> 0
    4. returnValue *= 10
    5. returnValue += zahl Mod 10
    6. zahl \= 10 'Stichwort Integerdivision, daher \ statt /
    7. End While
    8. Return returnValue
    9. End Function

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Du willst sie wohl nicht im gedachten Sinne invertieren, sondern die Ziffernreihenfolge umkehren, sodass aus 123 eben 321 und aus 123456789 eben 978654321 wird.
    tja - weiss man nicht.
    Sagen tut er:

    oobdoo schrieb:

    also Binär wird aus einer 1 eine 0 und umgekehrt.
    (alias "BitComplement")
    Sein Code aber zeigt eine Ziffern-umdreherei - was ja etwas komplett anderes ist.

    Was er nun will, weiss, wenn überhaupt einer, nachwievor nur er selbst.
    Für die die sich tiefer damit befassen wollen. Zeigt das Beispiel für unsigned und signed byte.

    Hier noch den Link für die 2'er-Komplements Online.
    exploringbinary.com/twos-complement-converter/

    Freundliche Grüsse

    exc-jdbi
    Dateien
    • BitwiseNot.pdf

      (207,13 kB, 79 mal heruntergeladen, zuletzt: )