Einzelne Bits umwandeln und prüfen

ocsme

Top Contributor
Guten Tag zusammen,

ich möchte ein Programm schreiben was ein int Wert in die Binärdarstellung umwandelt und dann z. B. das fünfte Bit invertiert und den modifizierten Wert wieder ausgibt.
Das ganze habe ich auch soweit hin bekommen doch ist es wirklich so umständlich oder gibt es dort wieder geeignete Methoden? Ich habe auch schon gegooglet und nicht wirklich viel gefunden. Es gibt einige Foren wo ähnliches gemacht wird die machen das mit den Operatoren ^ & | doch wie funktioniert das denn dann?
Und bei meinem Lösungsansatz mit String würde das nicht Funktionieren!

Java:
int a = 1000;
        String tmp=Integer.toBinaryString(a);
       
        //------------ falls String kleiner ist als 5 Stellen -->>>>>>>>
        for(int i=0;i<tmp.length()&&tmp.length()<5;i++)
            tmp="0"+tmp;
       
        char c=tmp.charAt(tmp.length()-5);
        if(c=='0')
            c='1';
        else c='0';
        char[] ch = tmp.toCharArray();
        for(int i=0;i<tmp.length();i++) {
            if(i==5)
                ch[i]=c;
            System.out.print(ch[i]);
        }

Wieso lässt sich das char[] auch nicht mit einer toString methode in ein String umwandeln :( die muss man selbst bauen :D Ich stehe heute irgendwie extrem neben mir :( denn ich hab schon so viel mit Strings und char[] s gemacht und jetzt klappt wieder nix :(

LG
 

Robat

Top Contributor
Du kannst mit new String(char[]) einen neuen String aus einem char Array machen

Es ist auch nicht nötig die Zahl erst explizit in die binäre String Repräsentation umzuwandeln.
number = number ^ (1 << (k-1)) tuts auch wenn du das k-te Bit ( für k 1-basiert) in number toggeln willst

Edit: mit String Builder geht's theoretisch auch
Java:
StringBuilder builder = new StringBuilder(Integer.toBinaryString(a));
builder.setCharAt(builder.charAt(5) == '0' ? '1' : '0', 5);

Edit#2: Bitset kannst du dir auch mal anschauen
 
Zuletzt bearbeitet:

ocsme

Top Contributor
Dank dir das mit dem new String(char[]) ist mir neu wieder was nettes gelernt Danke :)
Mit StringBuilder hatte ich es auch fast so hin bekommen :) Finde damit geht es viel Leichter als mit der unveränderlichen Klasse String ;)

Doch was ich momentan noch nicht so ganz verstehe ist mal wieder das hier:
Es ist auch nicht nötig die Zahl erst explizit in die binäre String Repräsentation umzuwandeln.
number = number ^ (1 << (k-1)) tuts auch wenn du das k-te Bit ( für k 1-basiert) in number toggeln wills

Mal anschauen vielleicht komme ich noch dahinter :)
 

ocsme

Top Contributor
Nochmals Danke werde ich tun :)
Es klappt zwar auch so doch das ist finde ich viel zu umständlich! Hier noch eine Methode wie man es ganz nett zu String umwandelt doch dann fehlt immer noch das Überprüfen der einzelnen Bits. Wenn ich dann sage ich hätte gerne das 2,4,6 bit Invertiert brauche ich ja wieder char[] muss durchlaufen etc. ....
Java:
public static string intToBinary(int n)
{
    string s = "";
    while (n > 0)
    {
        s =  ( (n % 2 ) == 0 ? "0" : "1") +s;
        n = n / 2;
    }
    return s;
}
 

ocsme

Top Contributor
horstiii2 ich wollte einen Integer Wert in Binär Umwandeln und dann verschiedene Bits wie z. B. das 2,3,5 Invertieren können. Dann wieder ein Integer Wert zurück geben ;)
Das ganze habe ich jetzt über String "gelöst!". Doch es ist denke ich weder elegant noch sicherlich nicht sehr effizient deswegen muss ich mir die binären Operationen mal anschauen :) Das habe ich noch nicht so ganz verstanden!

LG
 

ocsme

Top Contributor
Guten Tag,
so ich habe es nun korrekt mit String gelöst:
Java:
    public static int getBinaryInverse(int a) {
        String tmp=Integer.toBinaryString(a);
        //wenn Zahl kleiner ist als 5 Stellen!
        for(int i=0;tmp.length()<5 && i<tmp.length();i++)
            tmp="0"+tmp;
        char c=tmp.charAt(tmp.length()-5);
        c=(c=='0')?'1':'0';
        char[] ch = tmp.toCharArray();
        for(int i=0;i<tmp.length();i++)
            if(i==tmp.length()-5)
                ch[i]=c;
        String erg=new String(ch);
        int ergebnis=Integer.parseInt(erg,2);
        return ergebnis;
    }

Desweiteren habe ich mir die Binär Operatoren angeschaut und hätte eine Idee wie man das lösen könnte mein Problem ist nur ich hab keine Ahnung wie ich erkennen kann ob das 5te Bit gesetzt ist?
Meine Idee wäre ich habe eine Int zahl = 32 Bit also Hexadezimal ja 8 Ziffern.
Man nimmt die Zahl und negiert diese dann hätten wir 8 inverse Ziffern.
Nun müsste man das 5 Bit erkennen das ist:
FFFFFFEF denke ich doch wie macht man dann sowas? Und vor allem wie Invertiert man dieses dann wieder.
Ich denke wenn man das richtig hin bekommt wäre das sicherlich nur ein 2Zeiler :D
Doch ich bekomme es nicht hin!
LG
 

ocsme

Top Contributor
PS: Ich weis das man die letzten Zeilen in eine return machen kann :D
Java:
//        String erg=new String(ch);
//        int ergebnis=Integer.parseInt(erg,2);
        return Integer.parseInt(new String(ch),2);
Mir ging es nur um die Übersicht ;)
LG
 

Robat

Top Contributor
mein Problem ist nur ich hab keine Ahnung wie ich erkennen kann ob das 5te Bit gesetzt ist?
Das geht relativ einfach (bit ist 1-based)
Java:
public static boolean isNthBitSet(int number, int bit) {
    return ((number >> (bit-1)) & 1) == 1;
}
Erklärung am Beispiel 10 und zweitem Bit:
>> ist der Shift-Right Operator. Damit werden alle Bits um n Stellen nach rechts verschoben und links mit 0 aufgefüllt.
Die Bits von number werden also (bit-1) Stellen nach rechts geschoben - in dem Fall 2 - 1 = 1
Code:
number = 10 = 1010(bin)
number >> (2-1) --> 1010 >> 1  -> 0101
Nun steht unser gesuchtes Bit ganz rechts. Jetzt wollen wir herausfinden, ob es 1 oder 0 ist. Dazu kann man den & (AND) - Operator benutzen. Die Wertetabelle für den Operator sieht wie folgt aus:
Code:
0 & 0 = 0
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1
Man sieht also, ein "verunden" mit 1 gibt nur 1 zurück, wenn das Bit gesetzt, also 1, ist.
Code:
number = 10 = 1010(bin)
number >> (2-1) --> 1010 >> 1  -> 0101

  0101
& 0001
-------
  0001
Am Ende prüfen wir, ob das Ergebnis 1 ist. Falls ja, wissen wir, dass das Bit gesetzt ist.
 

ocsme

Top Contributor
Das habe ich verstanden :)
Es gibt in Java keine Möglichkeit ein einzelnes Bit direkt zu manipulieren oder? Denn jetzt wissen wir das dieses Bit gesetzt ist sehr schön :)
Nachdem wir geprüft haben das dieses Bit gesetzt ist möchte ich es jetzt manipulieren wenn es gesetzt ist Invertiere es ;)
Muss ich das ganze Teil wieder in ein String umwandeln? *hoffentlich nicht!*
Denn ich muss ja irgendwie an diese Stelle vorrücken das bedeutet etwas verschieben wenn ich es raus schiebe ist es verloren oder kann ich es in eine neue Variable schieben das wäre ja echt witzig :) und ab den stellen die man ändern möchte kommen die änderungen die dann weiter in die neue Variable geschoben werden :)

LG
 

Robat

Top Contributor
Es gibt in Java keine Möglichkeit ein einzelnes Bit direkt zu manipulieren oder?
Doch. Um das ganze abzukürzen hier gleich mal eine Hand von gängigen Operationen ;)
Java:
public static int clearNthBit(int number, int bit) {
    return (number & ~(1 << (bit-1)));
}

public static int setNthBit(int number, int bit) {
    return (number | (1 << (bit-1)));
}

public static int toggleNthBit(int number, int bit) {
    return (number ^ (1 << (bit - 1)));
}

public static boolean isNthBitSet(int number, int bit) {
    return ((number >> (bit-1)) & 1) == 1;
}
 

ocsme

Top Contributor
o_O wie kann ich dir den nur dafür DANKEN :)
das ist ja der Wahnsinn :)
so klappt das ganze wie ich es mir vorstelle :)

Java:
    int number = 16;
        int bit = 5;      
        if(isNthBitSet(number,bit))
            System.out.println(toggleNthBit(number,bit));

Das ist ja super Lieb :)
Danke :)

PS: die Methoden zu verstehen ist nicht das Problem darauf zu kommen ist die Hürde! Da muss ich mich mehr mit auseinander Setzen, die Sache ist nur das ich auch so schon genug zu tun habe da kommt man nicht hinterher soviel zu Lernen :( :D !!
 

Robat

Top Contributor
Mir würde es schon reichen, wenn du mir versprichst, dass du dir den Code anschaust und versuchst ihn zu verstehen, anstatt ihn nur zu kopieren :p
 

ocsme

Top Contributor
Ich schaue mir die Methoden gerade an!
Was ich nicht so ganz verstehe ist: Wenn ich eine Zahl habe sagen wir mal BinärDarstellung: 10101 wenn ich nun toggle also von links n bits (n=5) einschiebe also n-1 = 4
Dann würde doch dort stehen 10101 ^ 01111 oder etwa nicht? Doch dann würde was sehr komisches raus kommen 11010.
 

Robat

Top Contributor
Nicht ganz. Schauen wir uns die Zeile mal Stück für Stück an.
bit - 1 = 4 ... das hattest du bereits richtig erkannt.
<< ist der Left-Shift Operator ... die Bits werden also alle um n Stellen nach links geschoben und es wird von rechts mit Nullen aufgefüllt.
Code:
1 << 4 = 1000
^ ist der XOR-Operator .. die Wertetabelle für diesen Operator ist wie folgt
Code:
0 ^ 0  = 0
1 ^ 0 = 1
0 ^ 1 = 1
1 ^ 1 = 0
Es kommt also immer nur 1 heraus, wenn genau einer der beiden Eingaben 1 ist.
Code:
number ^ (1 << 4)
number ^ 10000

number = 10101
  10101
^ 10000
--------
  00101
 

ocsme

Top Contributor
Wieso steht jetzt oben 10000 also die 1 an der 5ten Stelle wenn ich doch nur um 4 Stellen schiebe?
Code:
1 << 4 = 1000
Code:
number ^ (1 << 4)
number ^ 1000
 

Robat

Top Contributor
Also 1 << 4 sagt ja verschiebe die Bits von 1 um 4 Stellen. 1 Binär dargestellt ist 1. Man könnte auch sagen: Füge auf der rechten Seite 4 Nullen an.
Code:
1. Verschiebung: 10
2. Verschiebung: 100
3. Verschiebung: 1000
4. Verschiebung: 10000
 

ocsme

Top Contributor
Ja ist mir gerade auch aufgefallen ich hatte es mir so veranschaulicht! :D
Code:
        System.out.println(Integer.toBinaryString((1<<0)));
        System.out.println(Integer.toBinaryString((1<<1)));
        System.out.println(Integer.toBinaryString((1<<2)));
        System.out.println(Integer.toBinaryString((1<<3)));
        System.out.println(Integer.toBinaryString((1<<4)));
        System.out.println(Integer.toBinaryString((1<<5)));
Ausgabe:
Code:
1
10
100
1000
10000
100000

Schiebe an Position 5 (zähle wie bei Array(wie der Informatiker) ab 0 beginnent!) und füge von rechts kommend nullen ein :D
 
X

Xyz1

Gast
zähle wie bei Array(wie der Informatiker) ab 0 beginnent
Oh das ist Definitionssache, aber zumeist starten Indizes mit 0 ja. Also sind 0 beginnend. :(
Dadurch kann der < Operator eingesetzt werden - und wohl theoretisch die Anzahl der Maschinenzyklen verringert werden.
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R einzelne Bits prüfen Java Basics - Anfänger-Themen 12
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
E JTable einzelne Zelle färben Java Basics - Anfänger-Themen 2
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
X Wie kann ich Zahlen in einzelne Zifferne zerlegen? Java Basics - Anfänger-Themen 3
C Auf einzelne Werte aus HashSet zugreifen Java Basics - Anfänger-Themen 10
K Einzelne Email verschieben nicht möglich Java Basics - Anfänger-Themen 3
F Arrays Sätze speichern und einzelne Worte mit Index Angabe auslesen Java Basics - Anfänger-Themen 4
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
B lanterna einzelne Zeichen aus dem Terminal löschen Java Basics - Anfänger-Themen 0
C Matrixmultiplikation ohne einzelne Elemente aufzurufen Java Basics - Anfänger-Themen 2
T JTable einzelne Zeilen löschen Java Basics - Anfänger-Themen 3
A Variablen String Array in einzelne Strings auspalten Java Basics - Anfänger-Themen 4
J Methoden Einzelne Objekte eines Vectors addieren Java Basics - Anfänger-Themen 10
S Einzelne Buchstaben aus Jtextfield in array Java Basics - Anfänger-Themen 2
R Einzelne Zahlen von der Eingabe (Scan) weiterverarbeiten Java Basics - Anfänger-Themen 3
D Kleinere Positionsangabe als einzelne Pixel bei Image? Java Basics - Anfänger-Themen 28
F Einzelne Werte aus einem Array vergleichen? Java Basics - Anfänger-Themen 8
H Input/Output JTextArea einzelne Zeile auslesen Java Basics - Anfänger-Themen 6
X String einzelne Buchstaben ersetzen Java Basics - Anfänger-Themen 4
M Einzelne Zeilen nach Zeichen auslesen Java Basics - Anfänger-Themen 4
T Erste Schritte einzelne Wörter aus textdatei lesen... Java Basics - Anfänger-Themen 4
M JTable einzelne Spalte rechtsbündig Java Basics - Anfänger-Themen 2
M JUnit - nur einzelne Methode testen? Java Basics - Anfänger-Themen 4
S Einzelne Werte von Array-Feld löschen Java Basics - Anfänger-Themen 15
N TextZeile in einzelne Strings teilen, die mit Komma getrennt sind Java Basics - Anfänger-Themen 4
A einzelne Zeichen aus String auslesen Java Basics - Anfänger-Themen 3
J Von einem String einzelne Wörter speichern Java Basics - Anfänger-Themen 6
H String zerlegen in einzelne Buchstaben (char)?? Java Basics - Anfänger-Themen 7
A Einzelne TeilStrings einfärben Java Basics - Anfänger-Themen 3
S mehrere einzelne klassen in eine datei packen Java Basics - Anfänger-Themen 4
K Datentypen Liste: Einzelne Einträge ändern Java Basics - Anfänger-Themen 2
D Einzelne Ziffern aus einem String Java Basics - Anfänger-Themen 10
B Was für Aufgaben haben die einzelne Entwurfsmuster? Java Basics - Anfänger-Themen 9
C Einzelne Werte eines Arrays ausgeben Java Basics - Anfänger-Themen 2
B Laufzeitverschlechterung durch Auslagerung in einzelne Threads Java Basics - Anfänger-Themen 8
MrMilti einzelne Methoden einer Klasse auslagern Java Basics - Anfänger-Themen 6
T Einzelne Ziffer zusammenfügen (ohne Strings oder Arrays) Java Basics - Anfänger-Themen 2
M einzelne Pixel setzen/auslesen Java Basics - Anfänger-Themen 2
N aus HTML einzelne Inhalte (z.B. Tabelleninhalte) auslesen Java Basics - Anfänger-Themen 10
A Nur einzelne Methode einer anderen Klasse starten Java Basics - Anfänger-Themen 2
G Einzelne Datei im jar verändern ? Java Basics - Anfänger-Themen 5
B Einzelne Zellen in JTable markieren Java Basics - Anfänger-Themen 2
C String.split("") einzelne Positionen abfragen Java Basics - Anfänger-Themen 10
ven000m Primzahl.class wie starte ich diese einzelne Datei? Java Basics - Anfänger-Themen 10
R einzelne Zelle einer JTable bearbeiten Java Basics - Anfänger-Themen 2
M Object zu Int Problem, obwohl einzelne Objecte Int sind =( Java Basics - Anfänger-Themen 2
J String - einzelne Zeichen sortieren Java Basics - Anfänger-Themen 14
G Einzelne Zeilen beschreiben Java Basics - Anfänger-Themen 4
E einzelne Zeile mithilfe Steams aus Textdatei überschreiben Java Basics - Anfänger-Themen 23
F einzelne Buchstaben in JTextField ändern Java Basics - Anfänger-Themen 11
S setCellRenderer für EINZELNE Zelle Java Basics - Anfänger-Themen 9
S Zugriff auf einzelne Buchstaben eines String Java Basics - Anfänger-Themen 16
J Jtable - wie einzelne zelle markieren Java Basics - Anfänger-Themen 8
I Wie viele 1 an Bits hat die Zahl x? Java Basics - Anfänger-Themen 5
D Erste Schritte Operatoren zur Manipulation von Bits "~" Java Basics - Anfänger-Themen 5
J Bits zusammen zählen Java Basics - Anfänger-Themen 4
X Datentypen Int oder String in Bits/Bytes umwandeln Java Basics - Anfänger-Themen 10
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
A Länge einer Hexadezimalzahl in Bits Java Basics - Anfänger-Themen 40
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
B Wieviele bits belegen die Datentypen? Java Basics - Anfänger-Themen 2
P Bits bei BigInteger abprüfen Java Basics - Anfänger-Themen 2
I Bits lesen und schreiben Java Basics - Anfänger-Themen 6
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
R int in Ascci umwandeln Java Basics - Anfänger-Themen 7
I JSON in Objekt umwandeln Java Basics - Anfänger-Themen 3
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
S JAR zu EXE umwandeln Java Basics - Anfänger-Themen 22
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
java-starter Erste Schritte Eingabe in Char wert umwandeln Java Basics - Anfänger-Themen 7
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
E PDF Datei im xfdf-Datei umwandeln und auf dem Laufwerk ablegen Java Basics - Anfänger-Themen 0
Naxon89 Input/Output Ein PDF in einem BLOB umwandeln um ihn dann als PDF wieder anzuzeigen Java Basics - Anfänger-Themen 3
C Rekursive Methode in Interative Methode umwandeln Java Basics - Anfänger-Themen 17
J Dezimalzahl in Bruch Umwandeln und Kürzen Java Basics - Anfänger-Themen 8
C Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln Java Basics - Anfänger-Themen 115
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
S String umwandeln Java Basics - Anfänger-Themen 6
F Character umwandeln als Double Werte Java Basics - Anfänger-Themen 8
K String in Integer umwandeln Java Basics - Anfänger-Themen 4
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
O von Basis 10 in Basis x umwandeln Java Basics - Anfänger-Themen 5
R Eingabe String umwandeln zu Integer Werten Java Basics - Anfänger-Themen 8
L String in Integer umwandeln Java Basics - Anfänger-Themen 3
I JSON Datei in Array umwandeln Java Basics - Anfänger-Themen 1
W Dezimalzahl in Binär umwandeln - Was sollte ich an meinem Programm verbessern? Java Basics - Anfänger-Themen 5
S \n nicht in Zeilenumbruch umwandeln Java Basics - Anfänger-Themen 5
W Dezimalzahlen in Binärzahl umwandeln. Wie möglich ? Java Basics - Anfänger-Themen 9
Vince42 NIO File Tree in XML umwandeln Java Basics - Anfänger-Themen 10
R Kompletten String umwandeln in Integer Java Basics - Anfänger-Themen 10
P 32 Bit Binärzahl Umwandeln in Dezimal Java Basics - Anfänger-Themen 8
H 32-Bit Zahl (Integer) in eine IPv4 Adresse umwandeln? Java Basics - Anfänger-Themen 2
Orkanson Datentypen Integer in String umwandeln/hinzufügen Java Basics - Anfänger-Themen 3
geekex Double zu String umwandeln in einer Methode Java Basics - Anfänger-Themen 28
MiMa String in Gross und Kleinbuchstaben umwandeln Java Basics - Anfänger-Themen 10
H JCalendar in String umwandeln Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben