位操作优点:
在计算机中所有数据都是以二进制的形式储存的。
位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。
位操作基础:
基本的位操作符有"与"、"或"、"异或"、"取反"、"左移"、"右移"这6种,
它们的运算规则如下所示:
位操作注意事项:
1) 在这6种操作符中,只有"~取反"是单目操作符,其它5种都是双目操作符。
2) 位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。
3) 位操作符的运算优先级比较低,所以尽量使用括号来确保运算顺序。
4) 位操作还有一些复合操作符,如"&="、"|="、"^="、<<="、">>="。
下边介绍一些在笔试面试中,经常遇到的问题。
1. &和&&的区别
1) &和&&都可以用作逻辑运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,
否则,只要有一方为false,则结果为false。
2) &&具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。
3) &可以用作位运算,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。
2. 不用中间变量交换 a,b的值(有多种方法,这里只介绍异或法)
int a=3, b=5;
a ^= b;
b ^= a;
a ^= b;
System.out.println(a); // 5
System.out.println(b); // 3
3. 判断一个数是基数还是偶数
// 将数值与1做按位与操作,如果结果是1则为基数,为0则为偶数
for(int i=0; i<100; i++){
if((i & 1) == 1){
System.out.println(i+"是基数");
}else{
System.out.println(i+"是偶数");
}
}
4. 求一个数的绝对值
int a = 5, b = -8;
int a_abs = (a ^ (a >> 31)) - (a >> 31); // 计算a的绝对值
int b_abs = (b ^ (b >> 31)) - (b >> 31); // 计算b的绝对值
System.out.println(a_abs);// 5
System.out.println(b_abs);// 8
5. 用最有效率的方法算出4乘以17等于多少
System.out.println(17 << 2); // 右移两位,相当于乘以4
6. 判断一个数n是不是2的幂
int n = 1024;
if((n & (n - 1)) == 0){
System.out.println(n + "是2的幂");
}else{
System.out.println(n + "不是2的幂");
}
7. 如果a大于0并小于65536,用移位法计算a乘以254的值
int a = 65530;
int res = (a << 8) -(a << 1); // 移位运算的优先级比较低,需要加括号
System.out.println(res); // 16644620