Listenelemente durch bitweise Verschiebung ?

Wurzelseppi

Mitglied
Hi zusammen,

hocke gerade auf der Leitung.


Kann mir einer folgendes erklären.

Ich habe ne Liste mit Elementen von denen jedes eine ID wie z.b 1,2,4,8,16 usw. hat.

Nun bekomme ich eine Zahl und möchte aufgrund der Zahl ermitteln, welche Listenelemente gemeint sind.

z.B bekomme ich 3

und möchte rechnerisch ermitteln, daß die Listenelemente mit den Ids 1 und 2 gemeint sind.

Oder ich bekomme 11 und möchte die Listenelemente 1,2,8 finden...

wie geht das... Oh mann.......danke schonmal im voraus zusammen.


Gruß Wurzelseppi
 
Pseudoalgo:
1. Gegebene nummer in einen Binärstring verwandeln
2. Positionen der 1en ermitteln
3. die Positionsnummern als Indexe verwenden

Gruß
Ollie
 
Hi Olli,

schonmal vielen herzlichen Dank.

Kannst mir evtl. ein kleines Beispiel dafür geben... nur zwei drei Zeilen.... vielen vielen Dank.

Gruß,

Wurzelseppi
 
Hi,

was haltet Ihr von dieser Lösung ohne Strings nur mit bitshiften. Geht natürlich statt mit Byte, auch mit int oder long.

Java:
package de.tutorials;

import java.util.ArrayList;
import java.util.List;

public class ByteToIndices {
	
	
	public void run() {
		System.out.println(getIndices((byte) 11));
	}
	
	private List<Integer> getIndices(byte b){
		List<Integer> retval = new ArrayList<Integer>();
		for(int i = 0 ; i < 8; i ++)
		{
			if ((b & 1) == 1)
				retval.add(i);
			b >>= 1;
		}
		return retval;
	}
	public static void main(String[] args) {
		new ByteToIndices().run();
	}

}
 
Hi,

Darf ich fragen wieso? Die Lösung mit Strings ist langsam, braucht mehr Speicher und shiftet nun wahrlich keine Bits wie gefordert.

Diese Zeile

if ((b & 1) == 1)

testet das letzte Bit

und diese schiebt alle bits um 1 nach rechts

b >>= 1

einfacher geht es doch kaum....
 
Hi, deine Lösung ist sicherlich die schnellere, vielleicht swappe ich ja nochmal, aber Olli war der erste der ne Lösung bot und die hab ich gleich eingebaut......


Vielen Dank aber nochmal.


Gruß,

Wurzelseppi
 
Hallo,

also ich find das hier einfacher:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.Arrays;

/**
 * @author Thomas.Darimont
 * 
 */
public class BitSetExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] positions = getPositionsByBitIndex(11);
        System.out.println(Arrays.toString(positions));
    }

    private static int[] getPositionsByBitIndex(int bits) {
        int[] positions = new int[Integer.bitCount(bits)];
        for (int currentBits = bits, bitPosition = 0, pos = 0; currentBits > 0; currentBits /= 2) {
            if (currentBits % 2 == 1) {
                positions[pos++] = bitPosition;
            }
            bitPosition++;
        }
        return positions;
    }

}

Gruß Tom
 
Zurück