【问题标题】:modifying a logical operator truth table修改逻辑运算符真值表
【发布时间】:2013-09-06 08:01:22
【问题描述】:

每个人都想知道是否有一种简单的方法可以将这个 Java 程序的真假值转换为 1 和 0 而无需做太多的体力劳动?我认为添加数据类型“字节”并具有两个单独的变量值 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));
    }

}

【问题讨论】:

  • 在最简单的情况下,您可以使用p?1:0,即三元运算符。你可以更进一步,添加一个封装操作符的实用方法。
  • @BoristheSpider 你应该把它写成答案。
  • 这是来自“a Java初学者指南第5版”,我只是复制了代码。下次我有问题时,我会尝试简化代码。所有回复都非常有用,谢谢。

标签: java truthtable


【解决方案1】:

重复使用相同的代码。通过将布尔值作为参数传递来创建一个简单的方法。

Method creation

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));
    }

【讨论】:

    【解决方案2】:

    你有很多代码重复。 从不复制粘贴,始终创建方法。这将使您的代码具有可读性和可维护性。即使在这样一个简单的练习中,它也总是很好的做法。

    打印10 最简单的方法是使用三元运算符,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 方法打印任意数量的booleans 来减少整个代码的硬编码:

    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();
    }
    

    【讨论】:

      【解决方案3】:

      在 Java 中,boolean 不能转换为 int(1 或 0)。看看this

      您也可以使用来自 Apache here 的 BooleanUtils

      【讨论】:

      • 您的意思是“布尔值没有转换方法”。当然你可以“b?1:0”。为此引入依赖项对我来说似乎有点过头了。
      • 我的意思是没有 if 语句就不能转换。这种依赖是为了简单。您可以创建自己的实用方法:)
      【解决方案4】:

      这个问题似乎是基于意见的。如果您主要关心演示形式,那么恕我直言,最简单的方式就是您在问题中提到的方式 -> 将 pq 更改为整数。您只需要将计算 NOT 的方式从 !p 更改为 1-p1^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
      

      【讨论】:

        【解决方案5】:
        public class Chapter2 {
        
            public static void main(String[] args) {
                System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");
                Compare(true ,true);
                Compare(true ,false);
                Compare(false ,true);
                Compare(false ,false);
            }
            static void Compare(boolean p, boolean q) {
                System.out.println((p?0:1) + "\t" + (q?0:1) +"\t"+((p&q)?0:1) + "\t" + 
                    ((p|q)?0:1) + "\t" +((p^q)?0:1) + "\t" + ((!p)?0:1));
            }       
        }
        

        【讨论】:

          【解决方案6】:

          我认为这是一种方法,因为在本书的那部分方法中,:? 等,即使尚未涵盖 else:

          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");
          

          【讨论】:

            猜你喜欢
            • 2015-03-25
            • 2018-05-12
            • 2020-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-08
            相关资源
            最近更新 更多