学习-Java位运算之逻辑位运算

任务描述

本关任务:根据输入获取的位运算符和运算数完成相应运算。键盘第一次输入的值为四种位运算符的一种,类型为字符型;第二次输入的是变量 a 的值,类型为 int 型;判断第一次输入的为何种位运算符,计算变量 a 使用该运算符与常量 10 的值,如果该位运算符为 ~,则将变量 a 的值进行取反,将最后结果不换行输出,如果不属于任何一种,输出:该字符无效

相关知识

为了完成本关任务,你需要掌握:

  1. 什么是位运算;

  2. 逻辑位运算的使用。

位运算

位运算:计算机在底层使用的是二进制补码进行运算。对应的二进制位进行操作,计算机只识别 0 和 1。位运算就是直接对整数在内存中的二进制位进行操作。

优点:巧妙的使用位运算可以大量减少运行开销,优化算法。

Java 中位运算符:只针对 int 类型的有效,Java 中,一个 int 的长度始终是 32 位,也就是 4 个字节,它操作的都是该整数的二进制数。也可作用于以下类型,即:byte,short,char,long(它们都是整数形式)。当为这四种类型时,会先把它们转换成 int 型再进行操作。

接下来我们来讲解位运算中的逻辑位运算。

逻辑位运算

逻辑位运算符有与 &、或 |、非 ~、异或 ^ 这四种。我们这里来为大家详细介绍这四种的使用。

与 & 位运算符

运算规则:全一则一,否则为零。

首先来看它在 Java 中的使用:

 
 
  1. int a = 10;
  2. int b = 28;
  3. System.out.print(a&b);

执行结果:

 
 
  1. 8

我们发现输出结果为 8,它是怎么算出来的呢?我们之前讲到它操作的是整型的二进制数,那我们来把 a 和 b 的值转化为二进制吧。

 
 
  1. 00000000000000000000000000001010 // a值的二进制
  2. 00000000000000000000000000011100 // b值的二进制

我们之前讲到了它的使用规则为“全一则一,否则为零”。这句话该怎么理解呢?

我们来看 a 值(二进制)的最后一位和 b 值(二进制)的最后一位 都是 0,规则中说全一则一,也就是这两个值都是 1 的话,它得出的结果为 1而现在它们两个值都为 0,所以它的结果就是 0;再接着看倒数第二位,a 值(二进制)和 b 值(二进制)的倒数第二位同理可得结果为 0;再接着看倒数第三位同样结果的出为零;倒数第四位它们的值都是 1,所以得出结果为 1;依次往前推,所以结果如下:

图1

我们得出 a&b 的值(二进制)为 00000000000000000000000000001000,而它的十进制形式则为 8 。

或 | 位运算符

运算规则:全零则零,否则为一。

首先来看它在 Java 中的使用:

 
 
  1. int a = 10;
  2. int b = 28;
  3. System.out.print(a|b);

执行结果:

 
 
  1. 30

规则中说全零则零,也就是这两个值都是 0 的话,它得出的结果为 0,否则结果就是 1 。通过上面的 & 运算符的例子,大家对它想必都有了一定的了解了,我们直接来看吧!

图2

而 00000000000000000000000000011110 的十进制就是 30 。

非 ~ 位运算符

前面讲到的 &、| 位运算符都是双目运算符,而 ~ 位运算符只是针对一个数的。它的意思为取反。使用规则:遇一则零,遇零则一。

首先来看它在 Java 中的使用:

 
 
  1. int a = 10;
  2. System.out.print(~a);

执行结果:

 
 
  1. -11

规则中说遇一则零,遇零则一,也就是如果为 1,则变为 0,如果为 0,就变为 1 。而且上面提到过 Java 中 int 型的长度为 32,所以取反时一定要想全。

图3

而 11111111111111111111111111110101 的十进制就是 -11 。

异或 ^ 位运算符

它与之前讲到的 &、| 位运算符都是针对两个数的,使用规则:相同为零,否则为一。

首先来看它在 Java 中的使用:

 
 
  1. int a = 10;
  2. int b = 28;
  3. System.out.print(a^b);

执行结果:

 
 
  1. 22

规则中说相同为零,否则为一,也就是这两个值如果相同的话,它得出的结果为 0,不同的话结果就是 1 (这里同样简化为 8 位)。

图4

而 00000000000000000000000000010110 的十进制就是 22 。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。

参考答案

import java.util.Scanner;
/**
 * 任务:键盘第一次输入的值为四种位运算符的一种,类型为字符型;
 * 第二次输入的是变量 a 的值,类型为 int 型;
 * 判断第一次输入的为何种位运算符,计算变量 a 使用该运算符与常量 10 的值,
 * 如果该位运算符为 ~,则将变量 a 的值进行取反,将最后结果不换行输出。
 * 如果不属于任何一种,则输出:该字符无效
 * 类名为:BitwiseOperation
 */
public class BitwiseOperation {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
        /********** Begin **********/
        // 第一步:获取键盘两次输入的值
        char c = reader.next().charAt(0);
        int a = reader.nextInt();
        // 第二步:根据输入的位运算符执行相应的运算。
        switch (c) {   
        case '&':
            System.out.print(a&10);
            break;
        case '|':
            System.out.print(a|10);
            break;
        case '~':
            System.out.print(~a);
            break;
        case '^':
            System.out.print(a^10);
            break;
        default :
            System.out.print("该字符无效");
            break;
        }
        /********** End **********/
    }
}

Guess you like

Origin blog.csdn.net/qq_53149358/article/details/121280536