VB-Rätsel

Es gibt 87 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    VB.NET-Quellcode

    1. Dim i, Eingabe, Ergebnis As Integer
    2. For i = 0 To Ergebnis =1 Step
    3. Ergebnis = Eingabe >> i
    4. If Ergebnis = 0 Then
    5. Label1.Text = "Keine Potenz von 2"
    6. Exit Sub
    7. Else
    8. Label1.Text = "Das Ergebnis ist eine Potenz von 2"
    9. End If
    10. Next
    11. End For
    12. ' alles wurde per Hand aus dem Kopf geschrieben
    To Ergebnis = 1
    heißt so viel wie es geht bis 0, es sei denn Ergebnis = 1, dann geht es bis eins(Boolean to Int).,..
    Außerdem kann es doch bei einer For-Schleife nicht gleich viele Operatoren sein, oder zählt das nicht?!
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    VB.NET-Quellcode

    1. Public Shared Function isPotent(ByVal zahl As Integer) As Boolean
    2. Dim x As Integer = zahl * 2 - 1 ' wenn zahl = 100, dann ist x = 111
    3. Return zahl - (x Xor zahl) = 1
    4. End Function


    bzw

    VB.NET-Quellcode

    1. Public Shared Function isPotent(ByVal zahl As Integer) As Boolean
    2. Return zahl - ((zahl * 2 - 1) Xor zahl) = 1
    3. End Function

    Nach einer Tasse Tee ist die Welt schon ganz anders.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    Also ich wollte durch "i" Zählen lassen bis das Ergebnis = 1 ist.
    da "i" immer um 1 größer wird, ist es gut zum Bitshiften geeignet, sobald eine 1 rauskommt liefert er mir das Ergebnis "Potenz von 2"
    Sobald es jedoch 0 ist liefert er "Keine Potenz von 2"

    1 = 2 hoch 0 (i = 0)
    10 = 2 hoch 1(i = 1)
    100 = 2 hoch 2 (i = 2)
    1000 = 2 hoch 3 (i = 3)

    kleines Bsp.

    110 ist keine Potenz von 2
    i = 1 -> 11
    i= 2 -> 1
    i = 3 -> 0

    Damn X( da ist noch ein Fehler

    Ich glaube ich müsste dann die Bits negieren um auf 0 Suche zu gehen.


    @ nikeee13
    nimm doch den Datentyp UInteger dann nimmt er dir den Betrag davon. (-> Hast dann die positiven Zahlen)
    und ginge das in deiner letzten Zeile so

    Return x - Zahl = 1

    ???

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xXAlphaXx“ ()

    xXAlphaXx schrieb:

    nimm doch den Datentyp UInteger dann nimmt er dir den Betrag davon. (-> Hast dann die positiven Zahlen)
    Eben nicht, dann gibts nen overflow.
    Ich bastel mir jetzt schnell nen Bitwise-Betrag, dann müsste es die Lösung sein.

    Edit:
    Da hab ich wohl den Wald vor lauter Bäumen nicht mehr gesehen. Betrag ist ja völlig unnötig. ein *(-) reicht ja. o0


    VB.NET-Quellcode

    1. Public Shared Function isPotent(ByVal zahl As Integer) As Boolean
    2. If zahl >= 0 Then
    3. Return zahl - ((zahl * 2 - 1) Xor zahl) = 1
    4. Else : Return False
    5. End If
    6. End Function


    Wobei das "zahl * 2" für nen Overflow sorgen kann. Ach fu. Ich lass es doch leiber.
    Ich gebe auf btw. Keine Lust mehr.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „nikeee13“ ()

    Gut, das war wohl ein Fehldenker. ich seh den Baum vor lauter Wald wohl nicht mehr. Oder anders rum? kA. :/
    Man, mit mir gehts Bergab.

    Bleibt bei meiner Lösung trotzdem noch das "Problem" mit dem Overflow, lol.
    Man könnte ja einfach nen UInt64 nehmen. Allerdings ändert das am "Problem" nichts. Für mich ist es erst gelöst, wenn man bis MaxValue prüfen kann.

    gruß,
    ikeee
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    Also ich denke mal das es mit BitShifting zu tun hat bzw. Bit Abfragen
    (Xor) wäre dabei ein Argument
    jedoch müsste man die einzelnen Bits Splitten :3 damit man auf den gewollten wert kommt.

    Denke so an Logische Bausteine (Split um ein Xor benutzen zu können) ^^
    @ xXAlphaXx:
    Mal davon abgesehen, dass Dein Code ein paar Fehler enthält, sollte die Anzahl Operationen ja immer gleich bleiben, was bei Deiner Idee nicht ganz hinhaut (je größer die Zahl, umso mehr Bitshiftings) ;)

    @nikeee13:
    Glückwunsch! ;) Deine Lösung würde ich so stehen lassen.
    (schei* auf Overflow! Das ist zu viel verlangt... Das Problem kann überall auftauchen
    und das zu negativen Potenzen, siehe blaze's Post)

    Noch "kürzer" gehts übrigens so:

    VB.NET-Quellcode

    1. Public Shared Function isPotent(ByVal zahl As Integer) As Boolean
    2. Return ((zahl - 1) And zahl) = 0
    3. ' wenn zahl = 100, dann ist (zahl - 1) = 011 und (zahl - 1) And zahl = 0
    4. End Function
    Hätte noch ne andere möglichkeit zu bieten :D

    VB.NET-Quellcode

    1. Dim i, i2, Eingabe AS Integer
    2. Dim Ergebnis As String
    3. i2 = 1
    4. For i = 0 To i2
    5. If Eingabe = 2^i Then
    6. Ergebnis = "Potenz von 2! (2 ^" & i & ")" " ' das >>"<< ist extra gemacht damit die Übersicht nicht verloren geht sonst zieht das durch 2 weitere Zeilen weiter :3
    7. Exit For
    8. ElseIf Eingabe < 2^i Then
    9. Ergebnis = "keine Potenz von 2!"
    10. Exit For
    11. ElseIf Eingabe > 2^i Then
    12. i2 +=1
    13. End If
    14. Next
    15. End For


    Wäre eine Lösung die auch möglich wäre ist ein Fortlaufender Prüfvorgang, aber deine Lösung ist die Beste :P hätte ich dank Rechner und Systemtechnik auch selbst drauf kommen können

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „xXAlphaXx“ ()

    ~blaze~ schrieb:

    Wenn nach 2 Tagen keine weitere Frage gestellt wurde, darf der, der als erstes postet, eine neue Frage stellen!
    Dann mach ich mal weiter. Etwas einfaches :D : Welche MessageBox(en) bekommt man zu sehen und warum?

    VB.NET-Quellcode

    1. Dim blub? As Boolean
    2. Dim foo As Boolean = True
    3. MessageBox.Show(CStr(CBool(CInt(foo))))
    4. If CInt(foo) = Convert.ToInt32(foo) Then
    5. MessageBox.Show("1")
    6. End If
    7. If Not blub Then
    8. MessageBox.Show("2")
    9. End If
    10. blub = foo
    11. If CBool(CLng(Math.Log(Math.Sqrt((CInt(foo) << 8) * (CInt(blub) >> 8)), 2)) >> 3) = Not foo Then
    12. If blub.HasValue Then
    13. MessageBox.Show("3")
    14. End If
    15. End If

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    MessageBox.Show(CStr(CBool(CInt(foo))))

    hier müsste eine Messagebox mit "True" kommen

    das erste If müsste er überspringen, weil Int32 entwas anderes als Integer ist,

    beim zweiten If hat blub den Value Nothing und überspringt es also, weil er nicht den Wert False hat

    was .HasValue bedeutet weiß ich nicht, des hat wahrscheinlich irgendwas mit dem Fragezeichen zu tun, wen des richtig isch, dann müsste eine Messagebox mit "3" kommen


    Gruß Vitox

    jvbsl schrieb:

    Dim blub? As Boolean

    Seid wann geht das und was hat das Fragezeichen dann für einen Einfluss auf die Variable?
    Noch nie was von Nullable-Typen gehört? :P
    Int32 entwas anderes als Integer
    Achja?
    -> forums.devx.com/showthread.php?t=53922 :
    Int32 is the underlying type in the .NET framework, whereas Integer is the
    'friendly' VB.NET name for it, in exactly the same way that 'int' is the
    friendly name in C#.
    lg SeriTools
    | Keine Fragen per PN oder Skype.