您的位置:首页 > 编程语言 > Java开发

java位元算

2016-10-03 14:01 148 查看
1.位介绍

       1.1)位运算优势:

      程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。所以运行效率更高更快。

        1.2)常见的位运算

运算符号

含义

                   运行原理

&

按位与

两个与位数都是1,才是1,其它都是0

|

按位或

两个操作的位数只要有一个为1,就是1,其它是零

^

按位异或

两个操作,数不同为1,相同为0

~

取反

按位逐个取反,0变成1,1变成0

<< 

左移

向左移动一定位数,尾部不够的位数补0

>> 

右移

向右移动一定位数,头部空出位数补零,

 

     1.2.1) &运算举例

      a)清零,直接和0与

        例如整数a为6[0000 0000 0000 0000 0000 0000 0000 0110],a&0x0000=

            0000 0000 0000 0000 0000 0000 0000 0000

     b)想要保留特定位数

       例如整数a想要保留第一位和第三位,只需要和0X5与即可[0000 0000 00000000 0000 0000 0000 0101]

   c)获取指定位数

      例如获取a位的三位的值,只需要和7与即可。例如a=30;

      a&7= 0000 0000 0000 0000 0000 00000001 1110 & 0000 0000 0000 0000 0000 0000 0000 0111 = 0000 0000 0000 00000000 0000 0000 1110

1.2.2)~按位取反

1.2.3)左右移动

     <<:左移一位数字放大两倍

>>:右移动一位,数字缩小两倍

1.3:位运算举例

    1.3.1)获取最大值

      int max= 1<<31 -1 ;

      int min=1<<31;

1.3.2)判断奇偶性

   [最后一位有1肯定是奇数]

    boolean isSigleNumber(int n){ 

           return(n & 1) == 1; 

}

1.3.3 不用临时变量交换两个数

a ^= b; 

b ^= a; 

a ^= b;

1.3.4 两个数字里的最大值

     /**

   * 1)(a-b) >> 31: a>b,结果是0;a==b,结果是0;a<b,结果是1

   * 2)(~(a-b) >> 31):a>b,结果是1;a==b,结果是1;a<b,结果是0

   */

  public static int max(int a,int b){ 

     return b & ((a-b) >> 31) | a & (~(a-b) >> 31); 

  }

 

1.3.5 两个数里的最小值

  public static int min(int a,int b){ 

     return a & ((a-b) >> 31) | b & (~(a-b) >> 31); 

  }

 

  1.3.6 数字是不是2的幂

booleanisFactorialofTwo(int n){ 

       /*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果为0*/ 

     return n > 0 ? (n & (n - 1)) == 0 : false; 

  } 

1.3.7 统计数字里位数为1的个数

/**

   *@function: 统计整数里值的1的总数,

   *@param x : 整形值

   *@return 返回整形的位数值

   */

  public static int bitcount(int  x)

  {

/*每次当前值与1与,结果大于0,就代表最后一位是1,结果加一,执行完对当前数字右移一位,相当于去比较倒数第二位是不是1,一次循环直到当前数为零,相当统计完了所有位置上的数了。*/

       int b=0;

       for (b = 0; x != 0; x >>= 1){

              if ((x & 1) > 0)

              {

                     b++;

              }

       }

       return b;

  }

 

1.3.8 把整形转换成2进制位数字符串

  public static String swtichIntToBit(int value){

       //int最高为是表示负数的,只转化正数

       if (value<=0) {

              return value+"" ;

       }

       StringBuffer builder = newStringBuffer();

       //从最低位逐步取出来对应的位数值,直到右移值为零

       for ( ; value !=0; value>>=1) {

              int bit= (value&1)>0? 1:0;

              builder.append(bit);

       }

       int less =32- builder.length();

       //补齐位数为32位

       for (int i = 0; i < less; i++) {

              builder.append(0);

             

       }

       return builder.reverse().toString();

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息