零度非安全 发表于 2017-1-15 16:59:41

【Java 教程(原创)】011.运算符与表达式(下)

本帖最后由 零度非安全 于 2017-1-19 14:38 编辑

【Java 教程(原创)】索引帖

位运算符

整型数据在内存中以二进制的形式表示,比如一个 int 型变量在内存中占 4 个字节,共 32 位。int 型数据 7 的二进制表示为:
00000000   00000000   00000000   00000111
左边最高位是符号位,最高位是 0 表示正数,是 1 表示负数。负数采用补码表示,比如 -8 的二进制表示为:
11111111   11111111   11111111   11111000
这样就可以对两个整型数据实施位运算,即对两个整型数据对应的位进行运算得到一个新的整型数据。

1>“按位与”运算符
“按位与”运算符“&”是双目运算符,用于对两个整型数据 a、b 按位进行运算,运算结果是一个整型数据 c。运算法则是,如果 a、b 两个数据对应位都是 1,则 c 的该位是 1,否则是 0。如果 b 的精度高于 a,那么结果 c 的精度和 b 相同。

例如:
    a:0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 1 1 1
&   b:1 0 0 0 0 0 0 1   1 0 1 0 0 1 0 1   1 1 1 1 0 0 1 1   1 0 1 0 1 0 1 1
————————————————————————————————————————————————————————————————————————————
    c:0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 1
2>“按位或”运算符
“按位或”运算符“|”是二目运算符,用于对两个整型数据 a、b 按位进行运算,运算结果是一个整型数据 c。运算法则是,如果 a、b 两个数据的对应位都是 0,则 c 的该位是 0,否则是 1。如果 b 的精度高于 a,那么结果 c 的精度和 b 相同。

3>“按位非”运算符
“按位非”运算符“~”是单目运算符,用于对一个整型数据 a 按位进行运算,运算结果是一个整型数据 c。运算法则是,如果 a 的对应位是 0,则 c 的该位是 1,否则是 0。

4>“按位异或”运算符
“按位异或”运算符“^”是二目运算符,用于对两个整型数据 a、b 按位进行运算,运算结果是一个整型数据 c。运算法则是,如果 a、b 两个数据的对应位相同,则 c 的该位是 0,否则是 1。如果 b 的精度高于 a,那么结果 c 的精度和 b 相同。

由异或运算法则可知:
a ^ a = 0
a ^ 0 = a
因此,如果 c = a ^ b,那么 a = c ^ b,也就是说,“^”的逆运算仍然是“^”,即 a ^ b ^ b 等于 a。

使用位运算符可以操作逻辑型数据,法则如下:
当 a、b 都是 true 时,a & b 是 true,否则 a & b 是 false。
位运算符在操作逻辑型数据时,与逻辑运算符 &&、||、! 不同的是,位运算符要在计算完 a 和 b 之后再给出运算的结果。比如,x 的初值是 1,那么经过下列逻辑比较:
((y = 1) == 0) && ((x = 6) == 6);
运算后,x 的值仍然是 1。但是,如果经过下列位运算:
((y = 1) == 0) & ((x = 6) == 6);之后,x 的值将是 6。

在下面这个例子中,利用“异或”运算的性质,对几格字符进行加密并输出密文,然后再解密,运行效果如下所示:



例子代码如下:

Xor.java
public class Xor{
      public static void main(String args[]){
                char a1 = '鱼',a2 = 'C',a3 = '论',a4 = '坛';
                char secret = 'A';
                a1 = (char)(a1 ^ secret);
                a2 = (char)(a2 ^ secret);
                a3 = (char)(a3 ^ secret);
                a4 = (char)(a4 ^ secret);
                System.out.println("密文:" + a1 + a2 + a3 + a4);
                a1 = (char)(a1 ^ secret);
                a2 = (char)(a2 ^ secret);
                a3 = (char)(a3 ^ secret);
                a4 = (char)(a4 ^ secret);
                System.out.println("原文:" + a1 + a2 + a3 + a4);
      }
}
static/image/hrline/4.gif

instanceof 运算符

instanceof 运算符是二目运算符,左边的操作元是一个对象,右边是一个类。当左边的对象是右边的类或子类创建的对象时,该运算符运算的结果是 true,否则是 false。

static/image/hrline/4.gif

运算符综述

Java 的表达式就是用运算符连接起来的符合 Java 规则的式子,运算符的优先级决定了表达式中运算执行的先后顺序。例如,x < y && !z 相当于 (x < y) && (!z)。鱼油们没有必要去记忆运算符的优先级别{:10_257:},在编写程序时尽量使用 () 运算符来实现想要的运算次序,以免产生难以阅读或含糊不清的计算顺序。运算符的结合性决定了并列的相同级别运算符的先后顺序{:10_256:},例如,加、减的结合性是从左到右,8 - 5 + 3 相当于 (8 - 5) + 3;逻辑运算符 ! 的结合性是从右到左,! ! x 相当于 ! (! x)。下表是 Java 中所有运算符的优先级和结合性,有些运算符和 C 语言中相同,我在这里整理给各位鱼油们{:10_285:}。


   优先级                         描                述               运算符               结合性
          1分隔符 []、()、.、,、;               从右到左
          2对象归类,自增、自减运算,逻辑非 instanceof、++、--、!               从左到右
          3 算术乘、除运算 *、/、%               从左到右
          4 算术加、减运算 +、-               从左到右
          5 移位运算 >>、<<、>>>               从左到右
          6 大小关系运算 <、<=、>、>=               从左到右
          7 相等关系运算 ==、!=               从左到右
          8 按位与运算 &               从左到右
          9 按位异或运算 ^               从左到右
         10 按位或运算 |               从左到右
         11 逻辑与运算 &&               从左到右
         12 逻辑或运算 ||               从左到右
         13 三目条件运算 ?、:               从左到右
         14 赋值运算 =               从右到左



【特别注意】贴子中的栗子希望鱼油们能自觉的手动敲上去,不要单纯的复制粘贴保存,然后编译运行。


点我前往上一讲
点我前往下一讲

xw0314 发表于 2017-1-15 20:53:24

{:10_266:}7的二进制不是111吗

小小七 发表于 2017-1-20 14:18:53

instanceof为何不举例呢{:9_221:}

零度非安全 发表于 2017-1-20 14:32:31

小小七 发表于 2017-1-20 14:18
instanceof为何不举例呢

这个可以自己网上查看其用法{:10_264:}

CarpLyy 发表于 2017-3-20 13:26:32

整理的很好

ShaunSS 发表于 2017-5-16 16:15:00

011 打卡

suiyisuixin2017 发表于 2018-4-15 21:10:27

谢谢讲解
页: [1]
查看完整版本: 【Java 教程(原创)】011.运算符与表达式(下)