2013-08-06 13 views
7

Ich brauche bestimmte Bit zu extrahieren reicht von mit einem langen Wert, zum Beispiel:Java erhält Bit reicht von einer langen

long input = 15367 (11110000000111) 

Was muß ich dann tun ist, zwei lange Werte aus der ursprünglichen lange zu extrahieren,

First long is 5 bits starting from bit 0, so bits 0:4 = 7 (0111) 
Second long is 56 bits starting from bit 8, so bits 7:55 = 60 (1111000) 

ich weiß, das mit Bitverschiebung und Maskierung durchgeführt werden kann, aber ich bin nicht ganz sicher, wie das zu implementieren, so dass es jedes Mal dynamisch ist, wie jedes Mal, wenn ich dies tun müssen, wird die lange unterschiedlich sein und auch die spezifischen Bitbereiche.

Ich habe gelesen über BitSets und BitArrays, aber ich bin nicht ganz sicher, dass dies die richtigen Dinge für den Job sind.

Jeder Rat auf dem besten Weg, dies zu implementieren, würde sehr geschätzt werden.

Danke!

Antwort

8

nrBits Bits von offset Position offset zu extrahieren, können Sie tun:

public static long extractSub(final long l, final int nrBits, final int offset) 
{ 
    final long rightShifted = l >>> offset; 
    final long mask = (1L << nrBits) - 1L; 
    return rightShifted & mask; 
} 

Hinweis der Benutzer des >>> rechten Shift-Operator; Das ist so, dass Sie das Zeichen nicht herumtragen.

Als (1L << nrBits) - 1L, das ist 2^nrBits - 1. Die L soll long Konstanten haben.

Beachten Sie auch, dass es keine "Grenzen" gibt (z. B. ein Offset oder eine Anzahl von Bits größer als 63 oder negativ).

+0

einfach das Ticket dank fge sagen könnte! – Tony

+1

Würde '' '' auch nicht so gut funktionieren, weil das '&' am Ende die erweiterten Zeichen '1' entfernt? (Eckfall zu Ihren Gunsten: Sie extrahieren Bits außerhalb der äußersten linken Grenzen Ihrer Eingabe, z. B. nrBits = 32, offset> 32) – zapl

+0

Nein, würde es nicht. Sagen Sie (mit 8 Bits zu vereinfachen), dass Sie '10001111' haben und drei Bits ab Offset 3 extrahieren wollten: Wenn Sie' >>> 'verwenden, ergibt die rechte Verschiebung' 00010001', aber mit '>>' würde es Gib '11110001' (das Vorzeichenbit wird übertragen). – fge

2

um Bits zwischen Bit x und y Bit zu extrahieren, wobei x die größere der beiden Zahlen ist, Sie

long mask = (Math.pow(2,x+1)-1)- (Math.pow(2,y+1)-1); 
long extract = input & mask; 
+0

Anstelle von 'pow (2, n)' können Sie '1 << n' verwenden. Und du meinst wahrscheinlich '&' statt '&&'. – arshajii

+0

Entschuldigung, Single &, du hast recht - behoben. Das Verschieben der 1n Positionen ist auch gut, wahrscheinlich schneller. – user1111284

+0

Danke user1111284! – Tony

Verwandte Themen