位运算符详细解析

位运算符计算,先把十进制转为二进制,计算完在转回十进制,以下位转换和计算规则

⼗进制和⼆进制的转换
⼗进制转⼆进制:⽬标数除以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

版权声明:本文为qq_44261638原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。