共计 2241 个字符,预计需要花费 6 分钟才能阅读完成。
二进制与十六进制
二进制用 0 1 表示 2= 10 十六进制 前缀 0x 用 0123456789ABCDEF 表示 2= 0x2 二进制与十六进制的转换十六进制的每位 等于二进制的四位
十六进制 0xF = 15(十进制) = 1111(二进制)
十六进制每位最大就是二进制的 1111 = 15(十进制)
二进制
2 = 10
十六进制
2 = 0x2 = 0010
规律很清晰了吧
20 = 10100(6 位 口算得出要补齐 8 位)
0001 0100
0001 = 1
0100 = 4
20 = 0001 0100 = 0x14
二进制字节
一个字节是 8 个二进制位 0000 0000 – 1111 1111 = 0-255 代表一个字节可以表示 256 个符号
UTF 编码字节
UTF-16
UTF-16 大部分使用两个字节编码,编码超出 65535 的使用四个字节 0x0000 – 0xFFFF 两个字节 0x010000 – 0x10FFFF 四个字节
UTF-8
0x0000 – 0x007F 一个字节 0x0080 – 0x07FF 两个字节 0x0800 – 0xD7FF、0xE000 – 0xFFFF 三个字节 0x010000 – 0x10FFFF 四个字节注: Unicode 在范围 D800-DFFF 中不存在任何字符
有符号 32 位整数节
所有的按位操作符的操作数都会被转成补码(two’s complement)形式的有符号 32 位整数。
反码、补码 负数
js 中的二进制转换是不会转换符号的
1 的反码 补码 以及 -1
1 = 0000 0000 0000 0000 0000 0000 0000 0001
反码 1 =0、0 =1 下面会讲述按位操作符 按位非 ~ 其实就是反码
1111 1111 1111 1111 1111 1111 1111 1110
补码后 末位 +1
1111 1111 1111 1111 1111 1111 1111 1111 = -1
按位操作符
按位操作符(Bitwise operators)将其操作数(operands)当作 32 位的比特序列(由 0 和 1 组成),而不是十进制、十六进制或八进制数值。例如,十进制数 9,用二进制表示则为 1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的 JavaScript 数值。&、| 在转码中比较常用
按位与 &
1 为真,0 为假 全真则真 遇假为假
js 内置方法
var a = 1;
a.toString(2);
十转二
2 = 10
3 = 11
二进制进行按位与运算 从左到右
1 && 1 = 1
0 && 1 = 0
2 & 3 = 10 = 2
按位或 |
1 为真,0 为假 遇真则真 全假为假
8 = 1000
9 = 1001
二进制按位或运算 从左到右
1 || 1 = 1
0 || 0 = 0
0 || 0 = 0
0 || 1 = 1
8 | 9 = 1001 = 9
按位异或 ^
1 为真,0 为假。不同为真 相同为假
4 = 100
5 = 101
二进制按位异或运算 从左到右
1 1 = 0
0 0 = 0
0 1 = 1
4 ^ 5 = 001 = 1
按位非 ~
1 为真,0 为假 对每一项进行非操作,遇真则假,遇假则真。(速算,~x =-1*x-1)
6 = 00000000 00000000 00000000 00000110
11111111 11111111 11111111 11111001 = -7
按位移动操作符
有两个操作数 左侧为要被移动的数字 (十进制,但是操作是内部对二进制操作) 右侧为移动的长度方向根据操作符移动,返回根据被操作数相同类型的结果,必须小于 32 位
左移操作符 <<
a << b 右侧末位开始补 b 个 0 左侧舍去 b 个位
11 = 00000000 00000000 00000000 00001011
11 << 2
右侧末位开始补 b 个 0
00000000 00000000 00000000 00001011 00
左侧舍去 b 个位
000000 00000000 00000000 00001011 00
格式化
00000000 00000000 00000000 00101100 = 44
-44 =
(反码)11111111 11111111 11111111 11010011
(补码)11111111 11111111 11111111 11010100
-11 =
(反码)11111111 11111111 11111111 11110100
(补码)11111111 11111111 11111111 11110101
-11 << 2
右侧末位开始补 b 个 0
11111111 11111111 11111111 11110101 00
左侧舍去 b 个位
111111 11111111 11111111 11110101 00
格式化
11111111 11111111 11111111 11010100 = -44
带符号右移操作符(记住左侧首位 0 代表正,1 代表负) >>
a >> b 左侧首位开始补 b 个 首位值 右侧侧舍去 b 个位
12 = 00000000 00000000 00000000 00001100
12 >> 2
补 b 个 首位值
00 00000000 00000000 00000000 00001100
右侧舍去 b 个位
00 00000000 00000000 00000000 000011
格式化
00000000 00000000 00000000 00000011 = 3
-3 =
(反码)11111111 11111111 11111111 11111100
(补码)11111111 11111111 11111111 11111101
-12 >> 2
-12 =
(反码)11111111 11111111 11111111 11110011
(补码)11111111 11111111 11111111 11110100
-12 >> 2
补 b 个 首位值
11 11111111 11111111 11111111 11110100
右侧舍去 b 个位
11 11111111 11111111 11111111 111101
格式化
11111111 11111111 11111111 11111101 = -3