zoukankan      html  css  js  c++  java
  • Java位运算基础知识

    在学习Java运算时,补充学习Java位运算。

    Java位运算

    位运算都是针对整数的补码进行位运算。

    & 按位与运算

    先将整数转换为补码 ,然后执行按位与运算,最后将结果返回为十进制,它有如下几个规律:

    (1)正数&其他数=正数 考虑最高位为0,按位与都为0

    (2)偶数&其他数=偶数 考虑最低位为0,按位与都为0

    (3)0&其他数=0 按位与后位数全是0

    (4)1&奇数=1,1&偶数=0 通过它可以快速判断一个数是奇数还是偶数

    | 按位或运算

    先将整数转换为补码 ,然后执行按位或运算,最后将结果返回为十进制,它有如下几个规律:

    (1)负数|其他数=负数 考虑最高位为1,按位或都为1

    (2)奇数|其他数=奇数 考虑最低位为1,按位或都为1

    (3)0|其他数=原数 按位或后位数不变

    ^ 按位异或运算

    先将整数转换为补码 ,然后执行按异位或运算,最后将结果返回为十进制,它有如下几个规律:

    (1)偶数^偶数=偶数 考虑最低位为0,按位异或为0

    (2)偶数^奇数=奇数 考虑最低位为1和0,按位异或为1

    (3)奇数^奇数=偶数 考虑最低位为1,按位异或为0

    (4)a^b^b或者b^a^b=a b^b=0,然后其他数异或一个0,就是原数

    示例代码

     1 public class OperatorAndOrXor{
     2     public static void main(String[] args){
     3         //测试按位与运算
     4         int a=9;
     5         int b=11;
     6         System.out.println(a&b);//9
     7 
     8         //测试按位或运算
     9         System.out.println(a|b);//11
    10 
    11         //测试按位异或运算
    12         System.out.println(a^b);//2
    13         System.out.println(a^b^b);//9
    14     }
    15 }

    测试结果

    << 左移

    数据左移,先将其转换为补码,然后向左移动相应位次,移出的部分舍弃,低位空出补0,最后转换为十进制,左移动几位相当于乘以2的几次方,如byte类型1左移3位,就是从0000 0001→0000 1000,变成了8。

    >> 右移

    数据右移,先将其转换为补码,然后向右移动相应位次,移出的部分舍弃,高位空出有两种情况,如果是正数高位补0,负数则高位补1,最后转换为十进制,一定范围内,右移动几位相当于除以2的几次方,如byte类型8右移3位,就是从0000 1000→0000 0001,变成了1。

    此外正数右移动,越移动0越多,如byte类型最后补码变成0000 0000,转换成原码也是0000 0000,最小变成0。

    负数右移动,越移动1越多,如byte类型,最后补码变成1111 1111,转换成反码为1111 1110,再转换为原码变成1000 0001,最后结果变成-1。

    >>> 无符号右移动

    无符号右移,先将其转换为补码,然后向右移动相应位次,移出的部分舍弃,高位空出不论正负数一律补0,最后转换为十进制。可以看出正数的无符号右移动和右移没有区别,负数就有区别了,负数的无符号右移>>>运算会变成正数,且负数越大,补码中1越多,无符号右移后正数越大。

    ~ 按位取反

    将数据转换为补码后,一律1变0,0变1,最后将结果转换为十进制,按位取反有互补对称公式-n=~n+1。

    代码部分

     1 public class MoveMethod{
     2     public static void main(String[] args){
     3         //测试左移、右移、无符号右移、取反运算
     4         //左移
     5         int i=1;
     6         System.out.println(i<<3);//8
     7 
     8         //右移
     9         int j=8;
    10         System.out.println(j>>3);//1
    11 
    12         //左移右移很大位数
    13         System.out.println(i<<35);//8
    14         System.out.println(j>>35);//1
    15 
    16         //无符号右移
    17         System.out.println(j>>>3);//1
    18         int k=-1;
    19         System.out.println(k>>>1);//负数变成正数
    20 
    21         //取反 -n=~n+1
    22         System.out.println(~j);//-9
    23         System.out.println(~k);//0
    24     }
    25 }

    测试结果

    需要注意的是,移位运算不是直接移动相应的位数,而是先将位数对32取余,对余数对应的数进行相应位次的移动。如1<<35=1<<(35%32)=1<<3=8。

    按位异或用于交换整数

    按位异或的特点可以用在整数交换上面,除了按位异或交换,还有其他两种交换方式。

     1 public class ChangeMethod{
     2     public static void main(String[] args){
     3         //交换值的三种方式
     4         //option1 按位异或交换,用于整数
     5         int a=5;
     6         int b=7;
     7         a=a^b;
     8         b=a^b;//b=a^b^b=a
     9         a=a^b;//a=a^b^a=b^a^a=b
    10         System.out.println(a);
    11         System.out.println(b);
    12 
    13         //option2 加减法交换,用于所有数值,除了整数还可以用其他数
    14         int x=5;
    15         int y=7;
    16         x=x+y;
    17         y=x-y;//y=x+y-y=x
    18         x=x-y;//x=x+y-x=y
    19         System.out.println(x);
    20         System.out.println(y);
    21 
    22         //option3 中间值交换,也叫做追尾法交换,适用所有类型
    23         int i=5;
    24         int j=7;
    25         int temp=i;
    26         i=j;
    27         j=temp;
    28         System.out.println(i);
    29         System.out.println(j);
    30 
    31     }
    32 }

    交换结果

    以上三种交换方式各有优缺点,总结就是以下几点,异或法效率最好,追尾法效率最低,使用频率上异或法最低,追尾法最高。

    总结

    (1)位运算目前学的一共有7种,进行运算时都需要转换为补码进行移动。

    (2)按位异或位运算可以用于交换两个整数。

    参考博文:

    (1)https://www.cnblogs.com/youngchaolin/p/10463887.html#_label4

    (2)https://www.cnblogs.com/youngchaolin/p/11290467.html

  • 相关阅读:
    “随手记”APP与已经发布的记账软件“鲨鱼记账”的差距
    团队绩效打分
    “随手记”改进方案
    “随手记”第一阶段成果展示
    “随手记”意见整理
    针对每个团队的项目意见或建议
    “随手记”开发记录day10
    团队十日冲刺8
    团队十日冲刺7
    团队十日冲刺6
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/11291809.html
Copyright © 2011-2022 走看看