package util; import components.Field; import components.FigureException; /** * Diese Klasse bietet die Moeglichkeit aus einem gegebenen Byte-Wert * die beinhaltenden Informationen zu extrahieren. * * @author Florian Franke * */ public class ExtractInformationFromBinary { /** * Wandelt den uebergebenen Byte-Wert in Binaer um. * @param sh Byte-Wert * @return String der Binaer-Zahl des Byte-Werts */ public static String byteToBinary(byte by) { return Integer.toBinaryString(by); } /** * Wandelt den gegebenen Binaer-Wert per BitShifting in Binaerschreibweise um. * Dient hier nur als Beispielmethode um Zeit zu sparen, * falls es mal im eigenen Code gebraucht wird. * Mit (1 << i) wird ein 1er-Bit um i-Schritte nach links verschoben. * Also bei i=3 ergibt es 8 (1000) * Anschliessend wird der gegebene Byte-Wert (sh) mit dem (1 << i) * logisch verUNDed: * 1000 = 8 (^=(1 << 3)) * & 1101 = 13 (als Beispielwert fuer den Byte) * ------ * 1000 = 8 => Also eine 1 an der 3. Binaerstelle * * @param sh Byte-Wert */ public static void getBinaryByBitShifting(byte by) { for (int i=7; i>=0; i--) System.out.print( ((by & (1 << i)) != 0) ? "1" : "0" ); } /** * Ermittelt die Schach-Figur aus dem Byte-Wert * @param sh Byte-Wert mit der Position, Farbe und Figur * @return Byte-Wert der Figur */ public static byte getFigure(byte by) { if (by > 0) { // Hole die ersten Drei und addiere sie byte value = 0; try { int currentBit = 0; for (int i=0; i<3; i++) { if ((by & (1 << i)) != 0) { // bit ist gesetzt, Wert ermitteln currentBit = (by & (1 << i)); // ermittelte Wert befindet sich bei 2^6 bis 2^8 // shift auf 2^0 bis 2^2 value += (currentBit >> 0); } } if (!ChessfigureConstants.isValidFigureType(value)) throw new FigureException("Ungueltige Figur aus Byte-Wert gelesen!"); } catch (FigureException e) { System.out.println(e.getMessage()); } return value; } else { return -1; } } /** * Ermittelt die X-Position der Figur (1-8) * @param sh Short-Wert mit der Position, Farbe und Figur * @return Byte-Wert der X-Position */ @Deprecated public static byte getXPosition(short sh) { if (sh > 0) { // Hole die ersten Drei und addiere sie byte value = 0; try { int currentBit = 0; for (int i = 3; i < 6; i++) { if ((sh & (1 << i)) != 0) { // bit ist gesetzt, Wert ermitteln currentBit = (sh & (1 << i)); // ermittelte Wert befindet sich bei 2^3 bis 2^5 // shift auf 2^0 bis 2^2 value += (currentBit >> 3); } } value++; if (!Field.isValidXPosition(value)) throw new FigureException("Ungueltige X-Position aus Short-Wert gelesen!"); } catch (FigureException e) { System.out.println(e.getMessage()); } return value; } else { return -1; } } /** * Ermittelt die Y-Position der Figur (1-8) * @param sh Short-Wert mit der Position, Farbe und Figur * @return Byte-Wert der Y-Position */ @Deprecated public static byte getYPosition(short sh) { if (sh > 0) { // Hole die ersten Drei und addiere sie byte value = 0; try { int currentBit = 0; for (int i = 0; i < 3; i++) { if ((sh & (1 << i)) != 0) { // bit ist also gesetzt, Wert ermitteln currentBit = (sh & (1 << i)); // addieren den Wert des Bits hinzu (z.B. 2^2=4) value += currentBit; } } value++; if (!Field.isValidYPosition(value)) throw new FigureException("Ungueltige Y-Position aus Short-Wert gelesen!"); } catch (FigureException e) { System.out.println(e.getMessage()); } return value; } else { return -1; } } /** * Ermittelt die Farbe der Figur * @param sh Byte-Wert mit der Position, Farbe und Figur * @return Farbe der Figur (byte-Wert) */ public static byte getColor(byte by) { if (by > 0) { // Hole das 3. Bit int currentBit = by & (1 << 3); byte value = 0; try { value = (byte)(currentBit >> 3); if (!ChessfigureConstants.isValidColor(value)) throw new FigureException("Ungueltige Farbe aus Byte-Wert gelesen!"); } catch (FigureException e) { System.out.println(e.getMessage()); } return value; } else { return -1; } } /** * Ermittelt das dem übergebenem byte-Wert, ob die Figur schon bewegt wurde * @param by * @return */ public static byte isMoved(byte by) { if (by > 0) { // Hole das 4. Bit int currentBit = by & (1 << 4); byte value = 0; value = (byte)(currentBit >> 4); return value; } else { return -1; } } /** * Gibt alle Informationen eines Byte-Werts als String zurueck. * @param sh Der Byte-Wert der Figur * @return String der Form "[Position(z.B. e2)]: [Figur], [Farbe]" */ public static String getAllInfosFromByte(byte by) { String s = ""; // Feld, auf dem die Figur steht //s += Field.getFieldName(Field.getFieldNumber(getXPosition(by), getYPosition(by))); //s += ": "; // Welche Figur steht dort s += ChessfigureConstants.getFigureName(getFigure(by)); s += ", "; // Farbe s += ChessfigureConstants.getFigureColor(getColor(by)); return s; } }