• Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)


    Java 逻辑运算符、位运算符、移位操作符  总结     作者:王可利(Star·星星)

    逻辑运算符,表格如下:

    解析逻辑运算符表:

    1.与 (&) 

    特点:两个都为真的时候,结果为真。两个为假的时候,结果为假。如果存在一个是假的,结果都为假的。

    2.或(|)

    特点:两个都为真的时候,结果为真。两个都为假的时候都是假的。如果存在一个是真的,结果都为真的。

    3.异或(^)

    特点:异,表示不一样的意思。所以两个判断都是一样的情况下,结果为假。两个判断结果都是不一样的情况下,结果为真的。

    4.非(!)

    特点:取非,如果是真的,那么结果就为假的。如果是假的,那么结果就为真的。

    5.双与(&&)、双或 (||)  ——>短路

    特点:

    在java里面,单个与(或) 和  两个与(或)运算方式是不一样,结果是一样的。

    单个与(或)会把所有的条件都判断一次,运算方式,不管第一个条件是假的还是真的,都会把后面的条件判断完了之后再输出结果。

    两个与(或),如果第一个数是真的,或者是假的就直接运行了,就不会再判断后面的条件,但是输出的结果真假和单与(或)没什么不一样。

    所以单个与(或)要比 两个 两个与(或)效率稍微高了一点。

    位运算符

     介绍:任何信息在计算机中都是以二进制的形式保存的,与(&)或(|)异或(^)除了可以作为逻

        辑运算符也可以作为位运算符。位运算是直接对二进制进行运算。

    位(bit)运算符:

    位运算符

     

    运算符含义

     

    &

    与(AND

    |

    或(OR

    ^

    异或

    ~

    取反

    规则:非零即真,所以 1 为 true ,0 为 false

    参考逻辑运算符可以得出以下结论:

        只有参与运算的两位都为1&运算的结果才为1,否则就为0

        只有参加运算的两位都是0| 运算的结果才是0,否则都是1

        只有参加运算的两位不同,^ 运算的结果才为1,否则就为0

    1与运算

    & 参见运算的两位数都为1&运算符结果才为1,否则就为0

    6 & 3

    00000000

    00000000

    00000000

    00000110

    6

    00000000

    00000000

    00000000

    00000011

    3

    00000000

    00000000

    00000000

    00000010

    & = 2

     

     

     

     

     

    2| 或运算

    | 参与运算的两位都为0|运算的结果才为0,否则就为1

    6 & 3

    00000000

    00000000

    00000000

    00000110

    6

    00000000

    00000000

    00000000

    00000011

    3

    00000000

    00000000

    00000000

    00000111

    | = 7

     

     

     

     

     

    3^ 异或运算

    ^只有参加运算的两位不同,^运算的结果才为1,否则就为0

    6 & 3

    00000000

    00000000

    00000000

    00000110

    6

    00000000

    00000000

    00000000

    00000011

    3

    00000000

    00000000

    00000000

    00000101

    ^ = 5

    4、~ 反码

    就是取反,二进制只有10,取反就是如果为1,取反就是0,如果是0,取反就是1

    0000-0000

    0000-0000

    0000-0000

    0000-0110

    6

    1111-1111

    1111-1111

    1111-1111

    1111-1001

    取反 -7

     

     

     

    System.out.println(~6);//-7

    结论:当参与取反的数值是正数时,把对应的值加上负号,再-1

         当参与取反的数值是负数时,把对应的值加上负号,再-1

    负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1

    负数表示

    负数对应的正数的二进制-1,然后取反。

    -6

    0000-0000

    0000-0000

    0000-0000

    0000-0110

    6

    1111-1111

    1111-1111

    1111-1111

    1111-1001

    取反

    1111-1111

    1111-1111

    1111-1111

    1111-1010

    1

    5、异或特点

    一个数异或同一个数两次,结果还是那个数用处一个简单的加密思想.

    6^3^3

    0000-0000

    0000-0000

    0000-0000

    0000-0110

    6

    0000-0000

    0000-0000

    0000-0000

    0000-0011

    ^3

    0000-0000

    0000-0000

    0000-0000

    0000-0101

    前面的结果

    0000-0000

    0000-0000

    0000-0000

    0000-0011

    ^3

    0000-0000

    0000-0000

    0000-0000

    0000-0110

    结果是6

    移位操作符

    表格如下:

    位运算符

     运算符

     运算

     范例

     << 

     左移

     3 << 2 = 12 --> 3*2*2=12

     >> 

     右移

     3 >> 1 = 1  --> 3/2=1

     >>> 

     无符号右移

     3 >>> 1 = 1 --> 3/2=1

     &

     与运算

     6 & 3 = 2

     |

     或运算

     6 | 3 = 7

     ^

     异或运算

     6 ^ 3 = 5

     ~

     反码

     ~6 = -

    位运算符的细节

     << 

     空位补0,被移除的高位丢弃,空缺位补0

     >> 

     被移位的二进制最高位是0,右移后,空缺位补0

     最高位是1,空缺位补1

     >>> 

     被移位二进制最高位无论是0或者是1,空缺位都用0补。

     &

     二进制位进行&运算,只有1&1时结果是1,否则是0;

     |

     二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;

     ^

     任何相同二进制位进行 ^ 运算,结果是0。   1^1=0 , 0^0=0

     不相同二进制位 ^ 运算结果是1。  1^0=1 , 0^1=1

    解析表内容:

    1、左移(算术移位)

    3 << 2 

    首先将3转换为2进制,

    00000000

    00000000

    00000000

    00000011

    3 的二进制

    00000000

    00000000

    00000000

    000011

    左移2位,砍掉高位

    0000 0000

    0000 0000

    0000 0000

    0000 1100

    低位补0

                 

     

     

     

     

     

     

    结果是12,所以3<<2 = 12;

    结论:左移就相当于乘以2的位移个数次幂.

    2、右移

    6>>2

     00000000

    00000000

    00000000

    00000110

    6的二进制

    000000

    00000000

    00000000

    00000001

    右移10被砍掉

     00000000

    00000000

    00000000

    00000001

    高位补0

                 

     

     

     

     

     

     

    结果是1,所以6>>2 = 1;

    结论:右移两位就是除以 22次方,右移一位就是除以 2的一次方。一个数往左移越移越大,往右边移越来越小。

     

    3、无符号右移(逻辑移位)

    通过演示发现右移时高位就空了出来,>> 右移时高位补什么要按照原有数据的最高位来决定。

    1111-1111 1111-1111 1111-1111 1111-1010    -6 >> 2

    1111-1111 1111-1111 1111-1111 1111-0010   

    最高位补什么要看原有最高位是什么

    那么使用>> 后原来是最高位1 的那么空出来的最高位还是1 的,是0的还是0

    如果使用>>> 无论最高位是0还是1 空余最高位都拿0 ,这就是无符号右移。

    1111-1111 1111-1111 1111-1111 1111-1010    -6 >>> 2

    001111-1111 1111-1111 1111-1111 1111-10   

     

    结果是;1073741822 

     

     

  • 相关阅读:
    Windows如何快速远程到另一台Windows并管理多个远程服务器
    基于视觉反馈的步进电机X-Y平台控制
    相机位姿估计3:根据两幅图像的位姿估计结果求某点的世界坐标
    相机位姿估计2:[应用]实时位姿估计与三维重建相机姿态
    相机位姿估计1_1:OpenCV:solvePnP二次封装与性能测试
    求空间内两条直线的最近距离以及最近点的坐标(C++)
    相机位姿估计1:根据四个特征点估计相机姿态
    相机位姿估计0:基本原理之如何解PNP问题
    记2016年中国移动广西公司面试(计算机类)
    子坐标系C在父坐标系W中的旋转问题
  • 原文地址:https://www.cnblogs.com/StarKL/p/6089503.html
Copyright © 2020-2023  润新知