美文网首页
位运算符

位运算符

作者: 张轻舟 | 来源:发表于2018-10-31 21:11 被阅读0次

    位运算符有哪些?

    & 位与
    | 位或
    ^ 位异或
    ~ 取反
    >> 向右移
    >>> 无符号右移
    << 向左移
    

    位运算符都是操作的二进制

    用法
    &,|,^,~ 的用法

    &:有0则0
    |:有1则1
    ^:相同则0,不同则1
    ~:按位取反

    例:

    System.out.println(6 & 3);                //2
    System.out.println(6 | 3);                //7
    System.out.println(6 ^ 3);                //5    
    System.out.println(~6);                    //-7?    
    

    分析:

    上面这些运算符会将数字转换成2进制再进行运算。6的二进制是110,3的二进制是011。根据上面的用法规则里面,列几个竖式:

    110
    011
    ———–
    010     &计算出十进制的2
    
    110
    011
    ———–
    111    |计算出十进制的7
    
    110
    011
    ———–
    101      ^计算出十进制的5
    

    00000000 00000000 00000000 00000110 6的原码反码补码都是本身
    11111111 11111111 11111111 11111001 对6取反,得到-7的补码
    00000000 00000000 00000000 00000001 补码减1
    ——————————————————————————
    11111111 11111111 11111111 11111000 反码
    10000000 00000000 00000000 00000111 原码(-7)

    ^的特点:一个数据对另一个数据位异或两次,该数本身不变。
    
    例:
    
    System.out.println(5 ^ 10 ^ 5);
    
    左移和右移
    
    <<:左移    左边最高位丢弃,右边补齐0
    >>:右移    最高位是0,左边补齐0;最高为是1,左边补齐1
    >>>:无符号右移 无论最高位是0还是1,左边补齐0
    例:
    
        //右移,向右移动n位就是除以2的n次幂,向左移动n位就是乘以2的n次幂
        System.out.println(12 >> 1);
        System.out.println(12 >> 2);
        System.out.println(12 << 1);        //24
        System.out.println(12 << 2);        //48
    

    小练习

    1、请实现两个整数变量的交换(不能使用第三方变量)
    2、最有效率的算出2 * 8的结果

    答案分析

    1、实现两个整数变量的交换很简单,但是这道题目却明确指出不能使用第三方变量。有两种方法。
    方法一:

    int a = 20;
    int b = 10;
    a = a + b;
    b = a - b;
    a = a - b;
    

    方法一有个缺点,如果数值超出了int类型的取值范围,将会损失精度

    方法二:

        int a = 20;
        int b = 10;
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
    

    2、直接操作二进制是比较快的,所以使用左移符号

    System.out.println(2 << 3);

    相关文章

      网友评论

          本文标题:位运算符

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