Datentypen Volle 16 Bit eines Short für flags Abfrage nutzen

Hallo zusammen!!!


Ich halte mich hier gerade an einer Aufgabe auf.
Gegeben:
-short Variable namens "flags" (die Bits sollen eine 16er Lichterkette steuern)
- das n-te Bit von "flags" entspricht der n-ten Lampe der Kette (0te Bit = Lampe 1....15te Bit= lampe 16)
-byte variable names "k" mit einem Wert zw. 0 und 15

Jetzt soll der Wert des "k"ten Bits von "flags" (also Zustand der Lampe "k") in einer weiteren Variable "b" gespeichert werden.


Mein Ansatz:
Da ich mehrere Aufgaben löse, habe ich diese jeweils als Funktionen implementiert.
Hier habe ich schon das Problem das mich Java kein Byte übergeben lässt ( das k).
Stimmt es, dass da nur Int und höher geht?

Ein short testFlags erstellen und mittels shift an die "k"te Stelle eine 1 schieben.
Anschließend per "&" abgleichen.
Allerdings ist das 16te Bit zu viel(short)
Jetzt suche ich mir einen Wolf wie ich das machen kann.
(vllt mit Integer.toBinaryString() ???)

Mein Code:
Code:
public static void flagWert(int k)  //Typ Byte kann nicht übergeben werden,daher int
{
          short flags = 58254;                   //58254 => 1110001110001110 in binary ;
                                                           //Stelle 15 von 0-15 ist zu viel für short?!
          short testflags = (short)(0b1<<k);
                                                          //Integer.toBinaryString(testflags<<k);?!?!
          int b=0;
       
          if ((flags & testflags)>0)
            {
              b=1;
              System.out.println("Die Lampe "+k+" leuchtet. Zustandswert: "+b);
            }
      
          else
            {
              System.out.println("Die Lampe "+k+" leuchtet nicht. Zustandswert: "+b);
            }
}
Lasse ich die 15te Stelle weg (oder setze sie null) - gibt es keine Probleme.
Mache ich dies nicht, dann bekomme ich den Fehler:
...error: incompatible types: possible lossy conversion from int to short
An der Stelle short flags =5.....;

Entschuldigt die Formatierung und Kommentare (waren meine Notizen).
Ich bin recht neu in dem ganzen und würde mich über einen Denkanstoß freuen.
 
Zuletzt bearbeitet:
Geht doch:

Code:
    public static void flagWert(byte k) //Typ Byte kann nicht übergeben werden,daher int
    {
        short flags = (short)58254; //58254 => 1110001110001110 in binary ;
        //Stelle 15 von 0-15 ist zu viel für short?!
        short testflags = (short) (0b1 << k);
        //Integer.toBinaryString(testflags<<k);?!?!
        int b = 0;

        if ((flags & testflags) > 0) {
            b = 1;
            System.out.println("Die Lampe " + k + " leuchtet. Zustandswert: " + b);
        } else {
            System.out.println("Die Lampe " + k + " leuchtet nicht. Zustandswert: " + b);
        }
    }
 
Wie meinen?!?!?
So hatte ich es auch schon aber überprüfe jetzt mal stelle 15 (also übergib den Wert 15 für k).
Dann sagt er die Lampe sei aus, obwohl sie leuchtet...

Woran liegt das?

Hängt das mit einem reservierten Bit für das Vorzeichen zusammen?
Sollte das durch die implizierte typumwandlung (short) nicht verhindert werden?
Sorry bin da wirklich noch am Anfang aber ich finde dazu nichts.
 
Hängt das mit einem reservierten Bit für das Vorzeichen zusammen?
Sollte das durch die implizierte typumwandlung (short) nicht verhindert werden?
Wenn das hoechstwertigste Bit gesetzt ist entspricht das halt einer negativen Zahl. Und der Bitweise Vergleich liefert dann eben genau dieses Bit zurück. --> -32768

Edit: ich würde die Abfrage aber so ändern:

Code:
        if ((flags & testflags) == testflags) {

Damit kannst du überprüfen ob genau die Bits aus testflags auch in flags gesetzt sind. Falls du mal den Fall hast dass du auf mehrere Lampne überprüfen willst
 
Zuletzt bearbeitet:
Edit: ich würde die Abfrage aber so ändern:

Code:
        if ((flags & testflags) == testflags) {

Damit kannst du überprüfen ob genau die Bits aus testflags auch in flags gesetzt sind. Falls du mal den Fall hast dass du auf mehrere Lampne überprüfen willst
Dann würde in diesem Fall aber die Funktionalität nicht mehr gegeben sein?!?!
Da ich ja nur auf eine Stelle überprüfe, würde ich immer einen Aus Status bekommen.
Es sind ja nicht alle Stellen gleich?!

Aber ich weiß was du meinst, bei einem Steuerungssoftware mit User Interface würde ich ohnehin Werte von 1-16 abfragen und den shift dann mit <<k-1 lösen oder ähnliches.
 
Du meinst den Parameter k ? da kannst du schon byte nehmen. Warum sollte das nicht gehen ?
Wenn ich...
Code:
public static void flagWert(byte k)
         {
              .....
          }

...nutzen will, bekomme ich die Meldung:

Code:
... error: incompatible types: possible lossy conversion from int to byte

Zu:
Doch. Klar geht das auch wenn du nur auf genau eine Lampe abprüfen willst
Jap war ein kurzer Denkfehler.
Das ist ne sehr schöne Lösung!!!

Vielen Lieben Dank schon mal!!!!
 
incompatible types: possible lossy conversion from int to byte
Das bekommst du dann beim Aufruf der Methode oder ?

Du musst sie dann natürlich mit einem byte-Wert aufrufen. Ich vermute mal du schreibst:

Code:
        flagWert(15);

für den Compiler ist das Literal 15 eine int-Zahl die er nach byte konvertieren will. Richtig wäre daher:

Code:
        flagWert((byte)15);
D.h. du castest auf byte und sagst dem Compiler damit dass es nichts zu konvertieren gibt
 
Das bekommst du dann beim Aufruf der Methode oder ?

Du musst sie dann natürlich mit einem byte-Wert aufrufen. Ich vermute mal du schreibst:

Code:
        flagWert(15);

für den Compiler ist das Literal 15 eine int-Zahl. Richtig wäre daher:

Code:
        flagWert((byte)15);

Diese wichtige Info habe ich auch gerade gefunden.
Ich danke dir vielmals.
Wieder viel gelernt...
 

Zurück
Oben