[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 目的

  1. 将不是number类型的数据转换为number
  2. 将number转换为无符号的32bit数据,也就是Uint32类型。这些与移位的位数无关,移位0位主要就是用了js的内部特性做了前两种转换。
  3. 本质上就是保证x有意义(为数字类型),且为正整数,在有效的数组范围内(0 ~ 0xFFFFFFFF),且在无意义的情况下缺省值为0

2^n 值: 2^3 = 1<<3 = 8

求一个数的 1/28/2 = 8>>1 = 4 前提是2的倍数

3 的二进制是 00011 第一位符号位 外加4位

-5 表示为二进制 11011 0101 -> 1011

Last Updated:
Contributors: Warren