如我们所知,计算机只能够识别二进制形式的数据,所以我们编写的程序中各种数据类型都是先转换成二进制再进行相应的运算的,这样就带来了一定的时间、空间开销,而使用位运算则是直接对二进制形式的数据进行运算操作,免除了转化的繁琐,因此合理的运用位运算能显著提高代码在机器上的执行效率。
下面举一些可以应用到位运算的例子:
1、用移位运算(>>、<<)代替除2运算
2、用位与运算(&)代替取余运算(%) 判断是否是偶数
1、用移位运算(>>、<<)代替除2运算
一个整数除2相当于它的二进制形式右移1位, 即 / 2 等价于 >> 1。(ps. 这里还有一些小问题需要注意,见后文。)
System.out.println("除法运算:");
int num1 = 32;
while(num1 != 0) {
System.out.print(num1 + " ");
num1 = num1 / 2;
}
System.out.println("\n移位运算:");
int num2 = 32;
while(num2 != 0){
System.out.print(num2 + " ");
num2 = num2 >> 1;
}
我们来细看一下移位运算。
(1)左移运算符m << n 表示把m左移n位,在左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。
(2)右移运算符m >> n 表示m右移n位,在右移n位的时候,最右边的n位将被丢弃,but!左边不再只是补上n个0,
如果m是一个无符号数或是正整数,则左边补n个0;
如果m是一个负整数,则左边补n个1。
换言之,右移运算时左侧用原数的符号位补齐(无符号则补0)。
2、用位与运算(&)代替取余运算(%) 判断是否是偶数
判断一个数是不是偶数只需要判断它的二进制形式最右边一位是不是0即可,所以拿他和1做位与运算,如果结果是0,则是偶数,反之则是奇数。即,n % 2 == 0 等价于 (n & 1) == 0 ,注意由于==的优先级高于&,所以需要给与运算加上小括号。
示例代码:
System.out.println("\n\n取余运算:");
for(int i=0; i<6; i++){
if(i % 2 == 0){
System.out.println(i + "是偶数");
}else{
System.out.println(i + "是奇数");
}
}
System.out.println("\n\n位与运算:");
for(int i=0; i<6; i++){
if((i&1) == 0){
System.out.println(i + "是偶数");
}else{
System.out.println(i + "是奇数");
}
}
文中的代码是用Java编写的,但是位运算的技巧同样可以应用在其他语言中(如C、C++),用法都大同小异。
祝好各位!