位运算符计算,先把十进制转为二进制,计算完在转回十进制,以下位转换和计算规则
⼗进制和⼆进制的转换:
⼗进制转⼆进制:⽬标数除以2,若能除尽,该位记做0,若除不尽,该位记做1,再对商继续除以2,以
此类推,直到商为0,然后把每⼀位的结果反序组合就是对应的⼆进制。
比如对十进制目标数10转二进制:
10/2=5–>0
5/2=2.5–>1
2/2=1–>0
1/2=0.5–>1
从下往上对应从左往右排列 所以转为的二进制是:1010
比如对十进制目标数17转二进制:
17/2=8.5–>1
8/2=4–>0
4/2=2–>0
2/2=1–>0
1/2=0.5–>1
从下往上对应从左往右排列 所以转为的二进制是:10001
⼆进制转⼗进制:从⽬标数的最后侧起,本位的数值乘以本位的权重,权重就是2的第⼏位的位数减⼀
次⽅,将每⼀位的值进⾏相加,得到的结果就是对应的⼗进制。
例如将二进制1010转为十进制
1 0 1 0
1*2^3 + 0* 2^2 + 1*2^1 + 0*2^0 = 8+0+2+0=10
例如将二进制10001转为十进制
1 0 0 0 1
1*2^4 + 0*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 16+0+0+0+1 = 17
位运算符:&(按位与)、|(按位或)、^(按位异或)、<<(左移)、>>(右移)
1、&(按位与)
计算规则:变量1 & 变量2:先把变量 1 和变量 2 转为⼆进制,每⼀位的数字⼀⼀对应,进⾏⽐较判断,若都为
1,则该位记做 1,否则记做 0
例如:计算10 & 17
位数不够左边补0,例如17的二进制是10001,10的二进制是1010比17的二进制少一位所以在前边补0变为01010
0 1 0 1 0
1 0 0 0 1
-------------
0 0 0 0 0 = 0(参考二进制转十进制的算法,所以结果是0)
2、|(按位或)
计算规则:变量1 | 变量2:先把变量 1 和变量 2 转为⼆进制,每⼀位的数字⼀⼀对应,进⾏⽐较判断,只要有1个为 1,则该位记做 1,否则记做 0
例如:计算10 | 17
0 1 0 1 0
1 0 0 0 1
-------------
1 1 0 1 1 = 1*2^4+1*2^3+0+1*2^1+1*2^0 = 16+8+0+2+1=27
3、^(按位异或)
计算规则:变量1 ^ 变量2:先把变量 1 和变量 2 转为⼆进制,每⼀位的数字⼀⼀对应,进⾏⽐较判断,相同记做0,不同记做 1。
例如:计算10 ^17
0 1 0 1 0
1 0 0 0 1
-------------
1 1 0 1 1 = 27
看到这里,可能就有人发现,咦,这个10 | 17 和这个10 ^17怎么结果一样,是不是有问题,下边代码校验
public class Demo2 {
public static void main(String[] args) {
//假设目标是是10
int a = 10 | 17;
int b = 10^17;
System.out.println(a);
System.out.println(b);
System.out.println(a == b);
}
}
27
27
true
两个结果都是27,结果位true
4、<<(左移)
计算规则:变量1 << 变量2:变量1乘以2的变量2次⽅ a<<b = a*2^b (a , b必须是整数)
举例子:2<<3
结果=2*2^3 = 2*8=16
5、>>(右移)
计算规则:变量1 >> 变量2:变量1除以2的变量2次⽅ a>>b = a/2^b,若结果为整数带小数则取整数,如果结果为复数带小数,结果取整然后减1
举例子:1>>2
结果=1/2^2 = 1/4 = 0.25 = 0
使用代码校验
public class Demo2 {
public static void main(String[] args) {
//假设目标是是10
System.out.println(2<<3);
System.out.println(1>>4);
System.out.println(-1>>4);
}
}
16
0
-1