изменение таблицы истинности логических операторов

Всем, кого я интересовал, есть ли простой способ преобразовать истинные и ложные значения этой программы на Java в единицы и нули, не выполняя слишком много ручного труда? Я решил добавить тип данных «байт» и иметь два отдельных значения переменных, 1 и 0, и вручную ввести их в код, но есть ли более простой способ?

public class LogicalOpTable1 {

public static void main(String args[]) {

        boolean p, q;


        System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");

        p = true; q = true;
        System.out.print(p + "\t" + q +"\t");
        System.out.print((p&q) + "\t" + (p|q) + "\t");
        System.out.println((p^q) + "\t" + (!p));

        p = true; q = false;
        System.out.print(p + "\t" + q + "\t");
        System.out.print((p&q) + "\t" + (p|q) + "\t");
        System.out.println((p^q) + "\t" + (!p));

        p = false; q = true;
        System.out.print(p + "\t" + q + "\t");
        System.out.print((p&q) + "\t" + (p|q) + "\t");
        System.out.println((p^q) + "\t" + (!p));

        p = false; q = false;
        System.out.print(p + "\t" + q + "\t");
        System.out.print((p&q) + "\t" + (p|q) + "\t");
        System.out.println((p^q) + "\t" + (!p));
    }

}

person user2742001    schedule 03.09.2013    source источник
comment
В простейшем случае вы можете использовать p?1:0, то есть тернарный оператор. Вы можете пойти дальше и добавить служебный метод, который является оболочкой для оператора.   -  person Boris the Spider    schedule 03.09.2013
comment
@BoristheSpider Вы должны написать это в качестве ответа.   -  person Fildor    schedule 03.09.2013
comment
Это из 5-го издания руководства для начинающих по Java, я только что скопировал код. В следующий раз, когда у меня возникнет вопрос, я постараюсь упростить код. Все ответы действительно информационные, спасибо.   -  person user2742001    schedule 04.09.2013


Ответы (5)


Один и тот же код использовался неоднократно. Создайте простой метод, передав логические значения в качестве аргументов.

Создание метода

public static void main(String args[])
    {
        System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");

        Sample sample = new Sample();
        sample.display(true, true);
        sample.display(true, false);
        sample.display(false, true);
        sample.display(false, false);

    }

    private void display(boolean p, boolean q)
    {
        System.out.print(p + "\t" + q + "\t");
        System.out.print((p & q) + "\t" + (p | q) + "\t");
        System.out.println((p ^ q) + "\t" + (!p));
    }
person newuser    schedule 03.09.2013

У вас много дублирования кода. Никогда копировать и вставлять, Всегда создавать методы. Это сделает ваш код доступным для чтения и сопровождения. Даже в таком простом упражнении это всегда хорошая практика.

Самый простой способ вывести 1 или 0 - использовать тернарный оператор, boolean ? 1 : 0 выполнит трюк с очень небольшим количеством символов.

Теперь, разделив ваш код на методы и применив тернарный оператор, мы имеем:

public static void main(String args[]) {

    System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");
    System.out.println(row(true, true));
    System.out.println(row(true, false));
    System.out.println(row(false, true));
    System.out.println(row(false, false));
}

private static String row(final boolean p, final boolean q) {
    return tabDelimited(p, q) + tabDelimited(p & q, p | q) + tabDelimited(p ^ q, !p);
}

private static String tabDelimited(final boolean a, final boolean b) {
    return (a ? 1 : 0) + "\t" + (b ? 1 : 0) + "\t";
}

Немного лучше, согласитесь?

Вывод:

P   Q   AND OR  XOR NOT
1   1   1   1   0   0   
1   0   0   1   1   0   
0   1   0   1   1   1   
0   0   0   0   0   1

Затем вы можете сделать все немного менее жестко запрограммированным, заставив метод tabDelimited печатать любое количество boolean:

public static void main(String args[]) {

    System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");
    System.out.println(row(true, true));
    System.out.println(row(true, false));
    System.out.println(row(false, true));
    System.out.println(row(false, false));
}

private static String row(final boolean p, final boolean q) {
    return tabDelimited(p, q, p & q, p | q, p ^ q, !p);
}

private static String tabDelimited(final boolean... toPrint) {
    if (toPrint.length == 0) {
        return "";
    }
    final StringBuilder sb = new StringBuilder();
    sb.append(toPrint[0] ? 1 : 0);
    for (int i = 1; i < toPrint.length; ++i) {
        sb.append("\t").append(toPrint[i] ? 1 : 0);
    }
    return sb.toString();
}
person Boris the Spider    schedule 03.09.2013

В Java boolean нельзя преобразовать в int (1 или 0). Взгляните на это

В качестве альтернативы вы можете использовать BooleanUtils из Apache здесь

person Ean V    schedule 03.09.2013
comment
Вы имеете в виду, что у Boolean нет методов преобразования. Конечно, можно - 1: 0. Мне кажется, что введение зависимости для этого излишне. - person Fildor; 03.09.2013
comment
Я имел в виду не конвертируемый без оператора if. Эта зависимость предназначена для простоты. Вы можете создать свой собственный служебный метод :) - person Ean V; 03.09.2013

Этот вопрос кажется основанным на мнении. Если вас волнует в основном форма представления, то ИМХО самым простым будет ваш способ, упомянутый в вопросе -> изменение p и q на целые числа. Вам нужно только изменить способ вычисления NOT с !p на что-то вроде 1-p или 1^p, потому что нет однобайтового оператора NOT.

Ваш код может выглядеть так

private static void printRow(int p, int q) {
    System.out.print(p + "\t" + q + "\t");
    System.out.print((p & q) + "\t" + (p | q) + "\t");
    System.out.println((p ^ q) + "\t" + (1 - p));
}

public static void main(String args[]) throws Exception {

    System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");

    printRow(1, 1);
    printRow(1, 0);
    printRow(0, 1);
    printRow(0, 0);
}

вывод:

P   Q   AND OR  XOR NOT
1   1   1   1   0   0
1   0   0   1   1   0
0   1   0   1   1   1
0   0   0   0   0   1
person Pshemo    schedule 03.09.2013

Я думаю, что это способ сделать это, поскольку в этой части книги методы:? И т. Д., И даже если еще не описаны:

System.out.print(p + "\t" + q + "\t" + (p * q) + "\t");
if(p != q) System.out.println((p + q) + "\t" + (p + q) + "\t" + q);
if((p == q) & (p == 1)) System.out.println(p + "\t0\t0");
if((p == q) & (p == 0)) System.out.println(p + "\t0\t1");
person HouinK    schedule 12.03.2017