[toc]
位运算
比特位Bit(b),
字节Byte(B), 千字节Kilobytes(KB), 兆字节 Megabytes(MB), 吉字节Gigabyte(GB), 太字节terabyte(TB)
utf-8(utf-8就是Unicode最重要的实现方式之一)中
一个英文字母占一个字节
一个中文字母占三个字节
1字节(Byte) = 8位(bit)二进制(0000 0000);1字节=1B, 1KB = 1024Byte = 1024*8 bit
负数以补码的形式存储
0x
表示整型数值 16进制0x1a === 16
\x
字符型常量 16进制\x3f === ?
/\x3f/.test('?')
返回true ?的ASCII为63\0
字符型常量 8进制/\077/.test('?')
返回true
原码 反码 补码
用8位二进制表示,最高位就是符号位所以表示的范围就为:[1111 1111, 0111 1111],即[-127, 127]
正数为0, 负数为1
原码:符号位加上值的绝对值
反码:正数的反码是其本身; 负数的反码是在其原码的基础上, 符号位不变,其余各位取反
补码:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1
~ (按位非运算) 与 ~~
~x // 等同于 -(x+1)
~~x // 等同于 -(-(x+1)+1)
// 应用: 判断条件结果相同; 后者结果为0 表示没有匹配到,有匹配值返回负数,负数也是true
if([].indexOf(x) > -1) {}
if(~[].indexOf(x)) {}
// 向下取整
~~1.23 // 1 比 parseInt 效率相对较高
逻辑位运算:
&(与) 同为1 则为1 否则为0 5&1 === 101&001 => 1
|(或) 有一个为 1 则为1 ^(异或) 两个位相同为0,相异为1 if(true^false)
判定为true ~(非) 取反
都不支持浮点数计算 所以可以取整 (12.33 | 0)
返回 12
示例:0与1互换 const fn = (n) => (n^1)
八进制 3 位 (37.416)8 =(11111.10000111)2
0x16
-> 0001 0110
-> 22(十进制) -> ; f
表示 1111
2|_57 1
2|_28 0
2|_14 0
2|_7 1
2|_3 1
1
逆序排列
=> 111 001
小数 乘2取整,顺序排列
0.8125
2
1.6250 取 1
.6250
2
1.2500 取 1
.25
2
0.5 取 0
0.5
2
1.0 取 1
=> 1011
移位运算符
左移:<<
正负数符号位不参与移动 低位补零(没有无符号左移,因为多余了,符号位都被移除了) 右移:>>
正负数符号位不参与移动 高位补符号位 无符号右移:>>>
正负数符号位当作数来看待 进行移动 高位补0
x >>> 0
目的
- 将不是number类型的数据转换为number
- 将number转换为无符号的32bit数据,也就是Uint32类型。这些与移位的位数无关,移位0位主要就是用了js的内部特性做了前两种转换。
- 本质上就是保证x有意义(为数字类型),且为正整数,在有效的数组范围内(0 ~ 0xFFFFFFFF),且在无意义的情况下缺省值为0
求 2^n
值: 2^3 = 1<<3 = 8
求一个数的 1/2
:8/2 = 8>>1 = 4
前提是2的倍数
3 的二进制是 00011
第一位符号位 外加4位
-5 表示为二进制 11011
0101 -> 1011