二进制
2019-03-20 本文已影响0人
椰果粒
什么是二进制
二进制以2为基数
计算机为什么使用二进制
- 组成计算机系统的逻辑电路有两种状态:开/关,由于每位数据只有开关两种状态,当发生故障时,也可以分析出是哪种状态出错了。
- 所以二进制表达式具有抗干扰能力强,可靠性高的特点。
而如果有十位的话,出现故障后,就不容易分析出哪个出错。 - 二进制也适合逻辑运算。
二进制的位操作
位运算包括:左移
,右移
,或
,与
,异或
左移
- 1001011左移一位变为:100100110(这是在数字没有溢出的情况下,左移之后,会在末尾添加一个0)
- parseInt('1001011',2) == 75
- parseInt('10010110',2) == 150
- 由此可见,左移一位(没有溢出),变为原来的2倍;2位就是4倍,以此类推
数字溢出:指二进制的位数超过了系统指定的位数,一般系统最少是32位
右移
JavaScript中,右移分为有符号右移
和无符号右移
- 无符号右移:去掉末尾的一位
- 1001011左移一位变为:100101
- parseInt('100101',2) == 37
- 由此可见,右移一位等于原来的数除以2的整数商
举一个有符号和无符号右移的例子
对应JavaScript代码
-123 >> 4 == -8 (有符号右移)
-123 >>> 4 === 268435448(无符号右移)
总结:
负数的无符号右移:取得补码,右移n位,最高位补0
负数的有符号右移:取得补码,右移n位,最高位补1,然后再取这个补码的补码
正数的有符号与无符号右移,结果都一样
与操作
与操作都是1,结果才是1
或操作
或操作只要有一个是1,就等于1
异或
异或只有符号位不同,才是1
验证
parseInt("1001011",2) | parseInt("1010100",2) // 95 "1011111"
parseInt("1001011",2) & parseInt("1010100",2) // 64 "1000000"
parseInt("1001011",2) ^ parseInt("1010100",2) // 31 "11111"