位运算

作者: 冉桓彬 | 来源:发表于2019-06-13 16:42 被阅读0次

    需要的掌握的知识点

    1. 原码
    2. 补码
    3. 反码
    4. 位移运算
    5. ~取反运算
    6. & 按位与
    7. | 按位或
    8. ^ 按位异或
    9. <<左移
    10. >>右移
    

    一、概念

    1.1 原码

    原码是一种计算机中对数字的二进制定点表示方法. 原码表示法在数值前面增加了一位符号位(即最高位为符号位): 正数该位为0, 负数该位为1(0有两种表示: +0和-0), 其余位表示数值的大小.

    1.2 反码

    正数的反码与其原码相同.
    负数的反码是对正数逐位取反, 符号位保持为1

    1.3 补码

    正数补码等于原码
    负数的补码等于原码的反码+1

    1.4 为什么要有补码

    java里的int是有符号的, 在内存中没有正负之分, 只有0/1, 整数是用补码表示的. 在计算机系统中, 数值一律用补码来表示和存储, 使用补码, 可以将符号位与数值域统一处理, 同时, 加法和减法也可以统一处理, 此外, 补码与原码相互转换, 其运算过程是相同的, 不需要额外的硬件电路.

    1.5 正数的原码、反码、补码
    数值 1:
    原码: 00000000 00000000 00000000 00000001
    反码: 00000000 00000000 00000000 00000001
    补码: 00000000 00000000 00000000 00000001
    
    1.6 负数的原码、反码、补码
    数值 -1:
    原码: 10000000 00000000 00000000 00000001
    反码: 11111111 11111111 11111111 11111110
    补码: 11111111 11111111 11111111 11111111
    

    二、位移运算

    2.1 Tinker in Java中的一段原话

    对char, byte或者short进行移位处理, 那么在移位进行之前, 它们会自动转换成一个int, 只有右侧的5个低位才会有用. 这样可防止我们在一个int数里移动不切实际的位数. 若对一个long值进行处理, 最后得到的结果也是long. 此时只会用到右侧的6个低位, 防止移动超过long值里现成的位数.

    2.2 移位操作符

    移位操作符是一个二元操作符, 两个操作数分别位于移位操作两边形如: 左操作数---移位操作符---右操作数. 含义是将左操作数按照移位操作符指定的移位方向, 进行右操作数指定的次数的移位.

    2.3 demo
    System.out.println("15 << 34:::" + Integer.toBinaryString(15 << 34));
    
    输出结果为: 15 << 34:::111100
    
    结合上面的结论对上面代码进行计算:
    首先右操作数为34, 二进制表现形式为100010, 只取右侧5位为00010, 结果为2,
    所以实际情况是: 15右移两位 = 111100
    

    相关文章

      网友评论

          本文标题:位运算

          本文链接:https://www.haomeiwen.com/subject/xzksfctx.html