• Java中的位运算符 &、|、^、~、<< 和 >>


    一、& 按位与运算符

    5 & 3 = 1

    5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101

    3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

    规则:对应的两个二进制位都为1时,结果位就为1,其他情况都为0。

    1 & 1 = 1
    1 & 0 = 0
    0 & 1 = 0
    0 & 0 = 0

    二、| 按位或运算符

    5 | 3 = 7

    5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101

    3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

    规则:只要对应的二个二进位有一个为1时,结果位就为1。

    1 | 1 = 1
    1 | 0 = 1
    0 | 1 = 1
    0 | 0 = 0

    三、^ 按位异或运算符

    5 ^ 3 = 6

    5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101

    3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

    异或的运算法则:

    0 ⊕ 0 = 0,1 ⊕ 0 = 1,0 ⊕ 1 = 1,1 ⊕ 1 = 0(相同为0,不同为1)

    这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

    四、~ 按位取反运算符

    取反,是 Java 使用补码来表示二进制数,在补码表示中,最高位符号位正数的符号位为0,负数的为1。

    ① 正数取反

    ~5 = -6

    5 转换为二进制数为:             0000 0000 0000 0101

    得到二进制数每一位(包括符号位)取反: 1111 1111 1111 1010(注意这和原码与反码之间的转换不一样)

    得到最终结果取补码:            1000 0000 0000 0110

    得到最终结果作为原码转换为十进制数:-6

    则 5 取反为 -6 。

    ② 负数取反

    ~ (-5) = 4

    -5 转换为二进制数为:         1000 0000 0000 0101

    得到二进制数取补码:          1111 1111 1111 1011(这里和走原码→反码→补码的流程一样)

    得到二进制数的补码每一位取反:   0000 0000 0000 0100(这里和不走原码→反码的取反不一样,全部位取反。到达这一步后所得的二进制数为正数,由于正数的原码、反码、补码相同,后面的运算可以忽略,视此步得到的为最终结果的二进制数)

    得到最终结果的取补码:       0000 0000 0000 0100

    得到最终结果的原码转换为十进制数:4

    则 -5 取反为 4 。

    注:逻辑取反符号 "!",!5 = 0,C中可以这么来,但Java中 "!"运算符不能用于int 。

    五、<< 左移运算符 和 >> 右移运算符

    ① 将一个数的各二进制位全部左移若干位移动的位数右操作数指定,右操作数必须是非负值,其右边空出的位用 0 填补高位左移溢出舍弃该高位。

    ( 2 << 1 ) 的结果为 4

    2 转换为二进制数为:   0000 0000 0000 0010

    全部位左移 1 位后为:     0000 0000 0000 0100

    转化为十进制为 4 。

    ② 将一个数的各二进制位全部右移若干位,移动的位数由右操作数指定,右操作数必须是非负值,其左边边空出的位用 0 填补低位右移移出的位则舍弃该位。 

    ( 2 >> 1 ) 的结果为 1

    2 转换为二进制数为:         0000 0000 0000 0010

    全部位右移 1 位后为:        0000 0000 0000 0001

    转化为十进制为 1 。

     

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

  • 相关阅读:
    日期时间工具类
    jQuery 使用attr()方式设置 checked 失效原因及解决方法
    vue总结
    【笔记】golang中使用protocol buffers的底层库直接解码二进制数据
    【笔记】对golang的大量小对象的管理真的是无语了……
    【记录一个问题】thanos receiver在更换tsdb文件后,内存并未显著下降
    【笔记】论文阅读:《Gorilla: 一个快速, 可扩展的, 内存式时序数据库》
    【分享】thanos receiver的grafana报表配置
    【采坑小计】thanos receiver的官方文档中,并未说明tsdb落盘的配置方式
    【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加
  • 原文地址:https://www.cnblogs.com/magic-sea/p/11407837.html
Copyright © 2020-2023  润新知