// 1. hét – A gyakorlati feladatok megoldásai
// Futtatás: java Exercises01.java
public class Exercises01 {

    // F1. Hány bit szükséges egy n >= 0 egész szám tárolásához?
    static int bitsNeeded(long n) {
        int bits = 1;
        while (n > 1) {
            n = n / 2;
            bits++;
        }
        return bits;
    }

    // F2. Egy szám kettes számrendszerbeli alakja (ismételt osztás 2-vel).
    static String toBinary(int n) {
        if (n == 0) return "0";
        String result = "";
        while (n > 0) {
            result = (n % 2) + result;
            n = n / 2;
        }
        return result;
    }

    // F3. Kisbetű -> nagybetű a karakterkód segítségével ('a' - 'A' == 32).
    static char toUpper(char c) {
        if (c >= 'a' && c <= 'z') {
            return (char) (c - ('a' - 'A'));
        }
        return c;
    }

    // F4. Két valós szám egyenlősége tűréssel.
    static boolean almostEqual(double x, double y) {
        return Math.abs(x - y) < 1e-9;
    }

    // F5. Igazságtábla kiírása.
    static void truthTable() {
        System.out.println("  a      b      a&&b   a||b   !a     a^b");
        boolean[] values = { false, true };
        for (boolean a : values) {
            for (boolean b : values) {
                System.out.printf("  %-6b %-6b %-6b %-6b %-6b %-6b%n", a, b, a && b, a || b, !a, a ^ b);
            }
        }
    }

    // F6. Túlcsordulás felismerése összeadás előtt.
    static boolean addWouldOverflow(int x, int y) {
        if (y > 0) return x > Integer.MAX_VALUE - y;
        if (y < 0) return x < Integer.MIN_VALUE - y;
        return false;
    }

    public static void main(String[] args) {
        System.out.println("F1. bitsNeeded(255) = " + bitsNeeded(255) + ", bitsNeeded(256) = " + bitsNeeded(256));
        System.out.println("F2. toBinary(50) = " + toBinary(50) + "  (ellenőrzés: " + Integer.toBinaryString(50) + ")");
        System.out.println("F3. toUpper('g') = " + toUpper('g') + ", toUpper('7') = " + toUpper('7'));
        System.out.println("F4. almostEqual(0.1+0.2, 0.3) = " + almostEqual(0.1 + 0.2, 0.3));
        System.out.println("F5.");
        truthTable();
        System.out.println("F6. MAX_VALUE + 1 túlcsordul? " + addWouldOverflow(Integer.MAX_VALUE, 1));
        System.out.println("    1000 + 2000 túlcsordul?    " + addWouldOverflow(1000, 2000));
    }
}
