• 15.java移位操作符


    << 左移

    >> 右移

    >>> 无符号右移

    位运算符

    运算符

    运算

    范例

    << 

    左移

    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 = -7

    位运算符的细节

    << 

    空位补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就是true,0就是false。

    案例:

    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;

    结论一个数往左移越移越大,往右边移越来越小.

    推论

    3<<2=12;  3<<1=6 ;  3<<3=24;

    3*4=12 ;  3*2=6;    3*8=24;

    3*22=12;   3*21=6    3*23 =24;

    结论往左移几位就是乘以2的几次幂。

    右移规律

    6>>2=1  ;6>>1=3 ;

    6/4=1   ; 6/2=3 ;

    右移两位就是除以 2的2次方,右移一位就是除以 2的一次方。

    总结 :>> 是除以2的移动位数次幂

         << 是乘以2的移动位数次幂

    用处:最快的运算是位运算。

     

    练习:最有效率的方式算出2乘以8等于几?

     

    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

    author@nohert
  • 相关阅读:
    Visual Studio的调试技巧
    释放linux的buff/cache
    Markdown画各种图表
    通过 SSH 转发TCP连接数据
    Linux之间用SSH传输文件 一行命令实现
    C# 使用OpenCV在一张图片里寻找人脸
    C# AOP 面向切面编程之 调用拦截
    ES5中新增的Array方法详细说明
    使用json数据动态创建表格2(多次绘制第一次简化 var tr=tbody.insertRow();)
    动态创建表格1
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13573033.html
Copyright © 2020-2023  润新知