了解一点位运算

严格来说,在团队程序开发里位运算是一个噩梦般的存在。毕竟不是每个人对这种奇特的运算感兴趣,但是总有程序员为了性能等各方面的考虑(特别是在大数据的处理方面)从而选择采用位运算。虽然位运算的写法相对晦涩难懂,但其性能提升明显也深受喜爱,故掌握和了解一点常见的位运算,为可能潜在的程序阅读和效率提升做些铺垫。

位运算基础

& 按位与:两个位都为 1 时,结果才为 1,否则返回0。

| 按位或:两个位都是 0 时,结果才为 0,否则返回1。

^ 按位异或:两个位相同时为 0,相异为 1。

~ 位取反:0 变 1,1 变 0。

<< 左移:各二进位全部左移若干位,高位丢弃,低位补 0。

>> 右移:将运算符左边的对象向右移动运算符右边指定的位数。不同编译器处理不尽相同,Java使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1。

应用

1、乘除2

左移运算等价于乘2,右移运算等价于除以2,其运算效率高于乘除法运算。

示例程序:

int a=100;
System.out.println(a<<1); //表示乘2 
System.out.println(a>>1); //表示除以2
System.out.println(a<<2); //表示乘4
System.out.println(a>>2); //表示除以4

运行结果:

200
50
400
25

2、判断奇偶数

我们通常采用偶数的数学定义(%2)来判断,由二进制原理知,二进制最后一位为0,则其转化为十进制后为偶数,若为1则十进制数为奇数,我们可以通过这个特点,与1进行按位与运算的结果判断是否为偶数。

参考实现:(本程序从键盘读入数字并进行判断)

import java.util.Scanner;

Scanner read;
read=new Scanner(System.in);	
		
int a;
a=read.nextInt();

if ((a&1)==1) {
	System.out.println(a+"是一个奇数。");
}
else {
	System.out.println(a+"是一个偶数。");
}

3、异或实现两个数字的交换。

先补充异或运算的两个性质,a^a=0;a^0=a。

未完待续……

分享