大家好,我是xp,最近看源码,经常会发现源码里面多采用了位运算的计算方式,所以写篇文章简单记录下位运算,下面我们就来聊聊关于位运算符是怎么算的?接下来我们就一起去了解一下吧!

位运算符是怎么算的(位运算基本知识)

位运算符是怎么算的

大家好,我是xp,最近看源码,经常会发现源码里面多采用了位运算的计算方式,所以写篇文章简单记录下位运算。

常见的位运算方式:

当然了,计算机执行位运算,都是先把值转成二进制,再进行计算的。

&:

简介:2个全是1,才是1 1&1 = 1, 0&1 = 0,1&0 = 0,0&0 = 0

举例:51&5

51:110011 5 :101 0011 0011 & 0000 0101 = 0000 0001 = 1

二进制前面补多少0都没意义,不计算那些0 ,但是要看规范是多少位的,比如Int是32的,位不够,前面全部补0。

&的特殊用法:

1、清零:只要让被&的数都是0,那么结果肯定也是0

2、取一个数的中指定位:

比如要取某个数的低4位,让被&的数的低4位都是1,其他都是0,就可以得到那个数的低4位

比如:10101010,取低4位, 1010 1010 & 0000 1111 = 0000 1010

|:

简介:只要有一个1,就为1 0|0 = 0, 0|1 = 1, 1|0 = 1, 1|1 = 1

举例:51|5

0011 0011 | 0000 0101 = 0011 0111 = 55

|的特殊用法:

将一个数的某些位,置成1

比如:1011 0000,将低4位,置成1,|上一个低4位为1,其他为0的 1011 0000 | 0000 1111 = 1011 1111

^:

简介:2个值一样,为0,不一样,为1 0^0 = 0, 0^1 = 1, 1^0 = 1, 1^1 = 0

举例:51^5

0011 0011 ^ 0000 0101 = 0011 0110 = 54

^的特殊用法:

1、将一个数的某些位,反转,0变1,1变0 比如:1011 1100 | 0000 1111 = 1011 0011 2、保留原值,| 0000 0000,感觉这个没意义 比如:1011 1100 | 0000 0000 = 1011 1100 ^效率最高

~:

简介:取反,0变成1,1变成0

<<:

简介:将一个数左移若干,左边丢弃,右边补0

举例:

1<<4 = 16 1左移4,就是10000,也就是16

如果左移的高位不包含1,那么每左移一次,相当于*2

举例:-14

强调:

-14的原码:1000 1110 反码就是: 1111 0001 然后补码,也就是加1:1111 0010 1111 0010 << 2 = 1100 1000(这里就不是*2) 11 : 1011 1011 << 2 = 101100 = 44(为啥这里也是*2,因为java中的int是32位,要补全) 00000000 00000000 00000000 1011 << 2 = 00000000 00000000 00000010 1100 = 44

>>:

简介:将一个数右移若干,正数左补0,负数左补1,右边丢弃,相当于/2

举例:

4 >> 2 =1 0100 右移 2,0001,也就是1 1111 0010 >> 2 = 1111 1100,负数左补1

>>> :

简介:将一个数右移若干,右移后左边空出的用0,右边的丢弃

差不多的意思,就不多举例了。

移位使用的周期数更少,所以更快。但是在实际测试时候没有差别是因为现代CPU是指令多周期并行处理,所以差距不大。如果在简单的芯片机上面,移位操作比除法快很多。

,