zoukankan      html  css  js  c++  java
  • JAVA的位运算<<、>>、>>>、&、|、^、~及实例

    一、位运算左移:<<

    指的是将对应的十进制先转换成二进制数,然后再根据需要移动几位来进行操作。比如

    5<<2指的是将5这个十进制数的二进制位往左移动两位

    5的二进制:00000000 00000000 00000000 00000101

    左移两位:00000000 00000000 00000000 00010100

    变成十进制数20。更简单的理解为:将要进行位运算的正数乘以2的N次方(N的值为要移位的位数),即5<<2就是5×2^2=20

    在左移过程中,低位(最右边)用0来补,比如5的二进制左移2位后,右边空两位,整数的符号位是0,那么就用0来补。

    例如:-5<<2指的是将-5这个十进制数的二进制位往左移动两位.

    5的二进制:00000000 00000000 00000000 00000101

    按位取反:111111111 111111111 11111111 11111010

    +1得到-5的二进制即:111111111 111111111 11111111 1111 1011

    左移两位:111111111 111111111 11111111 11101100

    这是负数的补码,变为原来的二进制,按位取反+1

    10000000 00000000 00000000 00010110

    即为-20,最高位是符号位。更简单的理解为(有待考证,但感觉是对的,~~~~~):将要进行位运算的负数()乘以2的N次方(N的值为要移位的位数),即-5<<2就是-5×2^2=-20

    二、位运算符右移:>>

    与运算符左移类似,不过区别在于:

    负数的移位上,比如-4>>2

    4的原码:00000000 00000000 00000000 00000100

    反码:111111111 111111111 11111111 11111011

    +1:111111111 111111111 11111111 11111100

    即-4的二进制码是:111111111 111111111 11111111 11111100

    右移两位:111111111 111111111 11111111 11111111

    取反加+1:10000000 00000000 00000000 00000001

    得出-1,最高位是符号位,符号位不会变化的,1代表负数,0代表整数。

    负数右移时,高位(最左边)用符号位来补,即右移的是负数,那么用1;右移的是正数,那么用0。

    比如:4>>2

    4的原码:00000000 00000000 00000000 00000100

    右移两位: 00000000 00000000 00000000 00000001

    变成1

    三、位运算符无符号右移:>>>

    无符号右移,忽略符号位,空位都以0补齐

    比如6>>>2

    二进制码:00000000 00000000 00000000 00000110

    右移两位:00000000 00000000 00000000 00000001

    高位(最左边)使用0来补齐的。

    比如负数:-6>>>2

    6的二进制码:00000000 00000000 00000000 00000110

    按位取反+1得到-6的二进制码:111111111 111111111 11111111 11111010

    右移两位:001111111 111111111 11111111 11111110

    变回去按位取反+1:11000000 00000000 00000000 00000010

    即得到1073741822

    注:

      1.x<<y 相当于 x*2;x>>y相当于x/2y

      2.如果x是负数,那么x>>>2没有什么算术意义,只有逻辑意义

    4的原码:00000000 00000000 00000000 00000100

    四、与运算符:&-按位与

    如果  4&7   那么这个应该怎么运算呢?

    首先我们需要把两个十进制的数转换成二进制 

         4 : 0000 0100

         7 : 0000 0111

    在这里要提到一点,1表示true,0表示false

    而与运算的时候相同位之间其实就是两个Boolean的运算

                         全true(1),即为true(1)

                         全false(0),即为false(0)

                         一false(0)一true(1),还是false(0)

    五、或运算符:|-按位或

    以   5|9   为例

       5 : 0000 0101 

       9 : 0000 1001

    在做或运算的时候

                     遇true(1)就是true(1),

                     无true(1)就是false(0)

    六、异或运算符:^-按位异或

    以 7^15 为例

               7:   0000 0111

               15: 0000 1111

    在异或的时候

                   只要相同都是false(0)

                   只有不同才是true(1)

    七、取反运算符:~-按位取反

    例:   ~15

            同样的先变成二进制:15:0000 1111

    这个其实挺简单的,就是把1变0,0变1

    注意:二进制中,最高位是符号位   1表示负数,0表示正数

    参考博客:https://www.cnblogs.com/SunArmy/p/9837348.html

    努力有用的话,还要天才做什么呢?
  • 相关阅读:
    下载安装ActiveMQ(消息队列)
    互联网项目架构之基于服务的分布式架构
    Shell报错bash^M /bin/bash^M: bad interpreter: No such file or directory
    rpm参数
    zabbix3.4+grafana5.0.1数据可视化
    Linux下目录栈操作详解
    有惊无险,拯救zabbix网页端
    tomcat7 开启gzip压缩
    欢迎使用CSDN-markdown基本语法
    新项目平台后台测试环境搭建
  • 原文地址:https://www.cnblogs.com/crazy-xf/p/10087261.html
Copyright © 2011-2022 走看看