目录
2进制反码
反码是基于二进制原码的变动,有两种情况,如果是正数的反码和原码相同。如果是负数的反码,则除了符号位,其他全部取反。
例如:6的反码就是0000 0110;-7的反码就是1111 1001。
2进制补码
补码是基于反码的变动,有两种情况,如果是正数的补码和原码反码都相同。如果是负数的补码,则在其反码的基础上,再加1。
注意:负数的运算都是使用补码进行的。
例:6的补码就是0000 0110;--6的补码就是1111 1010。
2进制补码的规律
通过观察我们可以发现6的补码和-6的补码相加为1 0000 0000。
我们再举例15的补码0000 1111,-15的补码1111 0001,相加为1 0000 0000,此时我们可以发现一个规律就是负数的补码加上该正数的原码(等于反码)等于所有位数归零并向前进一位。这里我们可以猜想出来反码补码更像是为负数“服务”的,他们的表示方式都有所不同。
2进制补码原理
首先我们要知道计算机是没有减法运算的,只有加法运算,那计算机怎么实现加法呢?
他是通过加上这数的负数来实现,例如6+-6,实际上是0000 0110 加上1111 1010,但是这2个数要求加上等于0,那么计算机就会将负数进行取反码在加上正数进行运算,由上面规律我们可以得知等于1 0000 0000,而实际上计算机的保存位数是有限的,这就会导致第一位溢出了,取0000 0000即运算后的结果变成了0。
我们也可以从下面这个角度去理解:
将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。
已知8的二进制是0000 1000,-8就可以用0-8:0000 0000减去0000 1000得出
00000000
-00001000
---------
这时我们会发现不够减,我们都知道当位不够减的时候,会“借位”,这时就相当于是1 0000 0000减0000 1000了
100000000
-00001000
---------
11111000
而1 0000 0000等价于1111 1111+1,现在可以拆分成两个式子
11111111
-00001000
---------
11110111
+00000001
---------
11111000
这就是补码的转换步骤
由0减去8得出了-8,也就是补码(-8)和原码(+8)相加的和为0
2进制补码js中简单应用
由上面我们可以得知其实负数在计算机中是以补码的形式去存储的。
~
按位非,~1=-2,计算过程为0000 0001取反等于1111 1110,即等于-2对应的补码,此时我们会发现一个特殊的~-1=0,计算过程为--1的补码为1111 1111 取反等于0000 00000,我们知道JavaScript中String上定义的一些字符串方法,例如search、indexOf等方法,当未匹配到字符串是返回-1,匹配到了返回第一个定位序号,那我们用if判断的时候即可用~search(),当未查询到的时候返回0,查询到了返回其它数。
number&-number
正整数number和自身的相反数求按位与的结果,number最大能被2**n整除。
例如 12最大能2**2(即4)
12 =0000 1100 -12=1000 1100 补码为1111 0011+ 1=1111 0100
0000 1100
& 1111 0100
——————————
0000 0100 = 4
search、indexOf等方法详解
JavaScript中常用函数方法(字符串篇)_AIWWY的博客-CSDN博客_js字符串函数