Spielereien mit bit wise Operatoren und langen Binärzahlen

berndoa

Top Contributor
Hallo,
ich habe die folgende Teilaufgabe die ich unzählige Male lösen muss:
Es seien 2 Zahlen A und B gegeben in Binärform mit 49 bits Länge (von denen 6 bits 1 sind der Rest Null).
1. Was für einen Datentyp kann ich für die nehmen?
Weil normales int könnte für zahlen, die im worstcase 2^49-1 groß sind, unpassend sein.
Und will eigentlich kein Big Integer benutzen oder so, weil für mich nur wirklich wichtig ist,
welche 6 der 49 bits 1 sind.

Was das, wenn man es als eine Dezimalzahl "umdeutet" genau für einen Wert hätte, ist für mich unwichtig.
Das mit den 49 bit ist einfach nur eine passende Darstellungsart zur Codierung beim vorliegenden Problem.


Nun müsste ich rausfinden ob die 2 Zahlen in >=3 Stellen übereinstimmen.
Hier wäre ein bit wises Und sichelrich sinnvoll (deswegen überhaupt auch die Darstellung)
um (in binär ausgedrückt) die Anzahl an gemeinsamen Stellen zu finden.

Nun ist es in der Aufgabe so dass ich
eine Zahl A habe und eine Liste an Zahl L.
und nun im Endefekt gucken will ob sich in der Liste L mindestens eine Zahl finden lässt,
die >=3 stellen gemeinsam hat.

Ich habe das gefühl, mit klug gewählten bitoperationen und Co. könnte man das durchaus klug umsetzen.

Und Effizienz wäre wichtig da ich wirklich seeeeehr viele Zahlen kreuz und quer vergleichen muss 🙂

Hat Jemand eine gute Idee wie ich das sinnvoll umsetzen kann?
 
Naja, wenn du 49 Bits brauchst und int offensichtlich nur 32 Bits speichern kann, würde sich das 64-bittige long anbieten.
Für den Test auf "wieviele Bits haben zwei Zahlen gemeinsam" bietet sich, wie du schon sagtest, ein bitweises UND an, zusammen mit der Operation, die als "Population Count" bekannt ist und in Java in der Long Klasse als bitCount() implementiert ist.
Unter x86 wird dabei dann die Instruktion POPCNT verwendet.
 
kann man irgendwie bei einer zahl, ohne jetzt was Eigenes zu schreiben, irgendwie rausfinden welche (6) bits ungleich null ist, gibts da vorgefertigte Funktionen dazu? 🙂
 
kann man irgendwie bei einer zahl, ohne jetzt was Eigenes zu schreiben, irgendwie rausfinden welche (6) bits ungleich null ist, gibts da vorgefertigte Funktionen dazu? 🙂
Keine eine Operation, nein.
Was soll denn da auch als Ergebnis rauskommen? Die 6 Bits, die ungleich null sind, sind dann halt die sechs bits in der Zahl selbst. Also -> die Zahl selbst.
Aber du willst vermutlich die Positionen bzw. Indizes der 6 Bits als Zahlen haben.

Aber du kannst dir was zusammenbauen mit logischen Rechts-Shifts (>>>) und Long.numberOfTrailingZeros().
Oder umgekehrt mit logischen Links-Shifts (<<) und Long.numberOfLeadingZeros().
 

Zurück
Oben