Bitverarbeitung

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich muss etwas in ein Programm implementieren und hänge gerade etwas fest.

Ich soll eine Bitverarbeitung programmieren.

Es gibt fünf bits, stehen für 5 Klassen.
Sollte der Wert der Bits = 1 haben, dann soll die Klasse 1 implementiert werden.
Sollte der Wert der Bits = 2 sein, dann soll KLasse 2 implementiert werden.
Sollte der Wert der Bits = 3 sein, dann soll Klassen 1 und 2 implementiert werden usw.

WIe kann ich eine Zahl so aufsplitten, sagen wir das ich einer Methode die zahl 3 Übergebe und er mit dann sagt Bit 1 und 2 sind gesetzt??


Gruß
 
S

SlaterB

Gast
du musst schon was über Bitoperatoren in einem Lehrbuch nachlesen
Code:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        for (int k = 0; k < 4; k++)
        {
            System.out.println(k + " - " + (k & 0x1) + " - " + (k & 0x2));
        }
    }
}
 

FArt

Top Contributor
Ich würde jetzt auch gerne fünf Bit verarbeiten... na ja, vielleicht doch lieber richtiges Bier ;-)
 
G

Guest

Gast
FArt hat gesagt.:
Ich würde jetzt auch gerne fünf Bit verarbeiten... na ja, vielleicht doch lieber richtiges Bier ;-)

Geh in die Kneipe bestell 1 Byte Bier dann bekommst Du 8 Bit ;).

SPaß bei Seite, kann mir vielleicht jemand die Methode schreiben, wie ich aus einer Zahl die einzelnen bitwerte rausbekomme??


Gruß
 
S

SlaterB

Gast
Tipp: suche mal dieses Topic ab, irgendwo hier hat das schon jemand gepostet ;)

natürlich nicht komplett mit Submethode die true/ false zurückgibt,
aber die entscheidende Berechnung schon
 

thE_29

Top Contributor
Ich bin so nett ;)

Code:
  public static boolean isBitSet(int zahl, int bitposition)
  {
    return isNumberInByte(zahl, (int)Math.pow(2, bitposition));
  }
  
  public static boolean isNumberInByte(int zahl, int number)
  {
    return (zahl & number) == number;
  }

Achja die bitposition fängt natürlich bei 0 an!

Also 0te Stelle == 1
1te Stelle == 2, etc...
 

Marco13

Top Contributor
Statt Math.pow kann man aber auch einen (wesentlich effizienteren) Bis-Shift verwenden.

@Gast: Kannst dir auch mal die Klasse "BitSet" ansehen, die bietet praktische Funktionen für sowas...
 

Wildcard

Top Contributor
Wenn man mit bit masken arbeitet, dann bitte auch mit richtigen Bitmasken und nicht mit Dezimal Zahlen als bit Repräsentation.
Mit | können Bitmasken aneinandergehängt werden, mit & kann auf gesetzte bits geprüft werden.
 

thE_29

Top Contributor
O, ja mit verschieben wäre woll besser gewesen ;)

@Wildcard: Was meinste mit Bitmasken arbeiten?
 
G

Guest

Gast
Jetzt muss ich ein Bit hinzufügen bzw entferntn.

d.H. Ich habe folgende Wertigkeit 1 1 1 1

Jetzt bekomme meine Methode eine 3 übergeben dann soll das raus komme 1 1 0 1.

Und Bit setztn 1 0 1 1 bekomme eine 2 übergeben

1 1 1 1
 
S

SlaterB

Gast
werden das hier deine Memoiren oder ist da auch eine Frage dabei? ;)

geht natürlich nur an alle anderen, die irgendwie anscheinend gerne für dich programmieren,
von meiner Seite nach wie vor der Tipp, ein Lehrbuch aufzuschlagen,
und alles ist klar
 

FArt

Top Contributor
SlaterB hat gesagt.:
werden das hier deine Memoiren oder ist da auch eine Frage dabei? ;)

geht natürlich nur an alle anderen, die irgendwie anscheinend gerne für dich programmieren,
von meiner Seite nach wie vor der Tipp, ein Lehrbuch aufzuschlagen,
und alles ist klar

SlaterB hat Jehova gesagt....
 

Wildcard

Top Contributor
Angenommen die BitMasken sehen so aus:
Klasse 1: 001x2
Klasse 2: 010x2
Klasse 3: 100x2
Nun sollen die bits für Klasse 1 und Klasse 3 gesetzt werden:
Code:
int result = Klasse1 | Klasse3;
zur Prüfung:
Code:
if(Klasse2 & result == Klasse2)
 
G

Guest

Gast
Ich greife das Thema nochmal auf:

Ich arbeite nun mit der Klasse BitSet, die macht eigentlich alles, was ich brauche.

Jetzt ist nur die Frage. Wie bekomme ich ein Integer in die BitSet. Und wie bekomme ich aus der BitSet eine Integer???


Gruß

Alaska
 

thE_29

Top Contributor
Tjo, das ist wirklich ne seltendumme Klasse, da es da keinen Wrapper gibt.

Musst du wieder dumm via & und | die int Zahlen zusammenbauen. Weiß nicht was sich da Sun gedacht hat, bzw. warum es noch immer keine wrapper Methoden von den Klassen (also Integer, Long, etc) gibt.

Hier der Code der hoffentlich klappt!

Code:
  public static int getFromBitSet(BitSet set)
  {
    int ret = 0;
    for(int x = 0; x != set.size(); x++)
    {
      ret |= set.get(x) ? 1 << x : 0;
    }
    return ret;
  }
  
  public static BitSet getFromInt(int zahl)
  {
    BitSet ret = new BitSet();
    for(int y = 0; zahl != 0; y++)
    {
      ret.set(y, (zahl & 1) == 1);
      zahl = zahl >> 1;
    }
    return ret;
  }
 

andre111

Bekanntes Mitglied
Bit setzen:

Code:
int i = 0;
int index = 2; // Index für das dritte Bit
i |= 1 << index; // Setzt das dritte Bit

überprüfen ob Bit gesetzt ist:

Code:
int i = 4;
int index = 2; // Index für das dritte Bit
if( ( i & ( 1 << index ) ) != 0 ) // Überprüft ob das dritte Bit gesetzt ist
{
    ... Wenn drittes Bit gesetzt ist
}
else
{
    ... ansonsten
}

Bit löschen:

Code:
int i = 4;
int index = 2; // Index für das dritte Bit
i &= ~( 1 << index ) // löscht das dritte Bit
 

thE_29

Top Contributor
Kannst du uns jetzt mal erklären was und wo etwas kompliziert ist?

Wir verwenden auch nur & und | (bzw, meinst du überhaupt mich?)
 

andre111

Bekanntes Mitglied
ich hab den beitrag eher geschrieben weil das die allgemeine Form für die beschriebenen Operationen ist.
Wenn Gast die verstanden hat sollte der Rest kein Problem mehr sein.
Und so kompliziert ist das nun auch wieder nicht.
Ist schon klar dass in diesem Fall auch nur ein einfaches & bzw | ausreicht
 

Landei

Top Contributor
LOOOITE!

Habt ihr euch eigentlich schon mal BigInteger angesehen? Insbesondere die Methoden clearBit(), flipBit() und setBit()? Umwandlung von / nach int ist dann auch kein Problem.
 

thE_29

Top Contributor
Wenn ich mir diese set Methoden anschaue, ist die BitSet Klasse sicher performanter!
Der gibt ja immer ne neue Klasse zurück!
 

Landei

Top Contributor
Es geht einfach (BigInteger) oder performant (andre111's Lösung). Aber ich glaube, fünf Objekterzeugungen hält Java gerade noch so aus...

BitSet lohnt sich erst, wenn man viele Operationen auf vielen Bits macht, und danach sieht die Aufgabenstellung nicht aus. Was man da an Komplexität beim Bit-Wurschteln spart, setzt man beim Konvertieren von / zu int wieder zu.
 

andre111

Bekanntes Mitglied
Wildcard hat gesagt.:
Angenommen die BitMasken sehen so aus:
Klasse 1: 001x2
Klasse 2: 010x2
Klasse 3: 100x2
Nun sollen die bits für Klasse 1 und Klasse 3 gesetzt werden:
Code:
int result = Klasse1 | Klasse3;
zur Prüfung:
Code:
if(Klasse2 & result == Klasse2)

so würds ich in diesem fall aber auch machen
 
Status
Nicht offen für weitere Antworten.

Oben