位运算符是怎么算的(位运算基本知识)
大家好,我是xp,最近看源码,经常会发现源码里面多采用了位运算的计算方式,所以写篇文章简单记录下位运算,下面我们就来聊聊关于位运算符是怎么算的?接下来我们就一起去了解一下吧!
位运算符是怎么算的
大家好,我是xp,最近看源码,经常会发现源码里面多采用了位运算的计算方式,所以写篇文章简单记录下位运算。
常见的位运算方式:
- & 与运算 6 & 3 = 2
- | 或运算 6 | 3 = 7
- ^ 异或运算 6 ^ 3 = 5
- ~ 反码 ~ 6 = -7
- << 左移 3 << 2 = 12(3*2*2)
- >> 右移 3 >> 1 = 1(3/2)
- >>> 无符号右移 3 >>> 1 = 1(3/2)
当然了,计算机执行位运算,都是先把值转成二进制,再进行计算的。
&:简介: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
强调:
- 负数的二进制就是正数的二进制,反码,然后加1,叫做补码
- 正数的原码就是一个正数对应的二进制,负数的原码是对应的二进制,但是最高位是1。正数的反码就是原码,负数的反码是除了符号位,其他全部取反。符号位就是左边第一位。
- 负数的二进制是原码的补码
- 正数的反码,补码都是原码
- 负数的反码是除了符号位,其他全部取反
- 负数的补码是该数的原码除符号位,其他全部取反,然后在最后一位加1
-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是指令多周期并行处理,所以差距不大。如果在简单的芯片机上面,移位操作比除法快很多。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com