程序中位运算的妙用

来源:互联网 发布:电脑数据怎么恢复 编辑:程序博客网 时间:2024/06/06 05:17

       程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位运算。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制110,11的二进制是1011,那么6 and 11的结果就是2(0010),它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理,同1为1,其余全为0)。位运算相较于其他计算符来讲,由于是直接使用计算机的方式来处理数据,无疑会被计算机更快的识别处理,提高程序运行速度。

1
~
2
<<、>>
3
&
4
^
5
|
6
&=、^=、|=、<<=、>>=
以上是位运算的优先级和种类。


下面举一些位运算的小例子:
1.&的妙用

 if((n&1) == 1)   {        System.out.println("n为奇数");      }
n&1是n和1做"按位与"运算,1的二进制只有末位是1,所以n&1就是只保留n的末位(二进制).n&1就表示了n的奇偶性.n若为偶数,其二进制表示最后一位一定为0,所以与1相与得0,而奇数则相反,其二进制最后一位一定为1所以与1相与得1,这样就可以判断一个数的奇偶性,而不是使用%2的方法来判断。


2.<< 和 >>的秒用

public class exercise{    public static void main(String[] args) {        int i=4;        int j=6;        System.out.println(i<<1);        System.out.println(j>>1);    }}
向左移相当于一个数乘2,向右移相当于除2,例如上面的4(省略到只有四位0100),向左移一位,就变成了8(1000),而6(0110),向右移一位则变为了3(0011)。


3^(异或)的妙用

public class exercise3 {public static void main(String[] args) {int i=-4;int j=6;boolean isNeg = (i^j)>>>31 == 0;if(isNeg){System.out.println("i,j同号");}else{System.out.println("i,j异号");}}}
异或的规则是同0异1,通常和>>>(无符号右移)搭配使用,>>表示有符号右移,如果该数为正,则高位补0,若为负数,则高位补1;>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。int类型32位,无符号右移31位则只剩下符号位,进行异或便可知道两数是不是同号。而且这样写最大的好处是不需要考虑数值越界的问题。


大概比较常用的有这几个,以后再进行补充。

原创粉丝点击