再美不及姑娘你
又见西风上碧树

题目:

例如 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

posted on 2022-06-10 19:07  再美不及姑娘你  阅读(46)  评论(0)    收藏  举报