题目:
例如 5*4=20,如何高效率实现?
答:位运算<<左移,将5左移两位
代码实现:
System.out.println(5<<2);//每左移一位,多乘一个2,左移三位代表5*2*2
知识点:位运算
| 位运算符 | 符号解释 | 
|---|---|
| & | 按位与,当两位相同时为1时才返回1 | 
| | | 按位或,只要有一位为1即可返回1 | 
| ~ | 按位非,将操作数的每个位(包括符号位)全部取反 | 
| ^ | 按位异或。当两位相同时返回0,不同时返回1 | 
| << | 左移运算符 | 
| >> | 右移运算符 | 
| >>> | 无符号右移运算符 | 
- 
位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果 
- 
从二进制到十进制都是基于原码 
- 
正数的原码反码补码都一样,负数原码反码补码不一样 
- 
byte,short,char在计算时按照int类型处理 
如何区分&,|,^是逻辑运算符还是位运算符?
如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符。
(1)左移:<<
运算规则:左移几位就相当于乘以2的几次方
注意:当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位
byte,short,char在计算时按照int类型处理
3<<4  类似于  3*2的4次= 3*16 = 48
 
-3<<4  类似于  -3*2的4次= -3*16 = -48
(2)右移:>>
快速运算:类似于除以2的n次,如果不能整除,向下取整
69>>4  类似于  69/2的4次 = 69/16 =4
-69>>4  类似于  -69/2的4次 = -69/16 = -5
(3)无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0,不看符号位
正数:和右移一样
负数:右边移出去几位,左边补几个0,结果变为正数
69>>>4  类似于  69/2的4次 = 69/16 =4
-69>>>4   结果:268435451
(4)按位与:&
运算规则:对应位都是1才为1
1 & 1 结果为1
1 & 0 结果为0
0 & 1 结果为0
0 & 0 结果为0
9&7 = 1
-9&7 = 7
(5)按位或:|
运算规则:对应位只要有1即为1
1 | 1 结果为1
1 | 0 结果为1
0 | 1 结果为1
0 & 0 结果为0
9|7  结果: 15
-9|7 结果: -9
(6)按位异或:^
运算规则:对应位一个为1一个为0,才为1
1 ^ 1 结果为0
1 ^ 0 结果为1
0 ^ 1 结果为1
0 ^ 0 结果为0
9^7  结果为14
-9^7 结果为-16
(7)按位取反:~
运算规则:~0就是1
~1就是0
~9  结果:-10
~-9  结果:8
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号