zoukankan      html  css  js  c++  java
  • java位运算符,&,|,>>>,>>,<<,<<<的区别

    说明

    最近读到java ReentrantReadWriteLock 用到了位运算符 所以先看位运算符 再去学习源码

    二进制在线计算器

    http://www.99cankao.com/digital-computation/binary-decimal-converter.php

    补码,反码,原码

    https://www.cnblogs.com/shamo89/p/9846385.html

    转为二进制进行运算 同为1时为1

    如:3&5,3的二进制:11,5的二进制为101 运算后为001

    计算

    011

    101

    ---

    001

    |

    转为二进制进行运算,同为0时为0,否则为1

    如:3&5,3的二进制:11,5的二进制为101 运算后为111

    011

    101

    ---

    111

    <<

    注:因为java int是32位所以补了一堆0

    表示左移移,不分正负数,低位补0;

    正数:4<<1 

        转换为二进制00000000 00000000 00000000 00000100<<1   

               二进制向左移动1位低位补0得出00000000 00000000 00000000 00001000

               转为10进制=8

    负数-4<<1

                负数的二进制表示为绝对值的二进制最高位补1,10000000 00000000 00000000 00000100

                反码(最高位符号位不变)11111111 11111111 11111111 111011

                补码(最低位进1)11111111 11111111 11111111 1111100

                补码左移(最低位补0) 11111111 11111111 11111111 111000

                反码(最高位符号位不变)11111111 11111111 11111111 110111

                原码(最高位符号位不变),10000000 00000000 00000000 00001000 最高位是符号位 所以我们直接拿1000转二进制等于8  最高位1 表示负数 所以得出-8

    <<<

    java没得这个编译出错

    >>

    表示右移,如果该数为正,则高位补0,若为负数,则高位补1;

    正数:r = 4 >> 1

            转换为二进制00000000 00000000 00000000 00000100

            右移1位 00000000 00000000 00000000 00000010

            转为10进制 2

    负数 r = -4 >> 1

             转换为二进制10000000 00000000 00000000 00000100

             反码 11111111 11111111 11111111 11111011

             补码 11111111 11111111 11111111 11111100

             补码右移1位 11111111 11111111 11111111 11111110

             (根据补码反推反码)11111111 11111111 11111111 11111101

             (根据反码反推原码)原码10000 00000 10000 00000010

             10转二进制 2 符号位1表示负数 最终得出-2

    >>>

    表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0

    正数: r = 4 >>> 1

        的结果与 r = 4>> 1 相同;

    负数: r = -4 >>> 1

      转换为二进制10000000 00000000 00000000 00000100

             反码 11111111 11111111 11111111 11111011

             补码 11111111 11111111 11111111 11111100

             补码右移1位(高位补0) 01111111 11111111 11111111 11111110

             补码转10进制等于2147483646

           

  • 相关阅读:
    Tarjan求LCA
    过滤器、监听器、拦截器的区别
    java操作Redis缓存设置过期时间
    Redis和Memcached区别,Redis的过期策略
    缓存穿透、缓存击穿、缓存雪崩区别和解决方案
    Memcached和Redis在Linux下的安装
    jmeter学习
    用FastDFS一步步搭建文件管理系统
    version control
    关于Linux的防火墙命令和端口占用查询
  • 原文地址:https://www.cnblogs.com/LQBlog/p/15210471.html
Copyright © 2011-2022 走看看