# 前言

• 进制转换
• 按位操作符
• Javascript进制转换
• 手动实现进制转换

# 进制转换

## 十进制转二进制

### 整数

// 除二取余
18 / 2 = 9...0
9 / 2 = 4...1
4 / 2 = 2...0
2 / 2 = 1...0
1 / 2 = 0...1

// 倒序排列
10010


### 小数

16 / 2 = 8...0
8 / 2 = 4...0
4 / 2 = 2...0
2 / 2 = 1...0
1 / 2 = 0...1

0.125 * 2 = 0.25
0.25 * 2  = 0.5
0.5  * 2  = 1

10000.001


## 二进制转十进制

### 整数

2^5 2^4 2^3 2^2 2^1 2^0
1   0   1   0   1   0
------------------------
32 + 0 + 8 + 0 + 2 + 0 = 42


### 小数

10110.11转十进制:

2^4 2^3 2^2 2^1 2^0 2^-1 2^-2
1   0   1   1   0 .  1   1
-------------------------------
16 + 0 + 4 + 2 + 0 + 0.5 + 0.25 = 22.75


# 按位操作符

## 按位与（ AND）

     9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)


function assert(n) {
return n & 1 ? "奇数" : "偶数"
}
assert(3) // 奇数


## 按位或（OR）

     9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 | 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15 (base 10)


12.1 | 0 // 12
12.9 | 0 // 12


## 按位异或（XOR）

     9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 ^ 9 (base 10) = 00000000000000000000000000000111 (base 2) = 7 (base 10)


## 按位非（NOT）

 9 (base 10) = 00000000000000000000000000001001 (base 2)
--------------------------------
~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)


~~16.125 // 16
~~16.725 // 16


## 左移（Left shift）

     9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)


function power(n) {
return 1 << n
}
power(3) // 8


## 有符号右移

     9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)


     -9 (base 10): 11111111111111111111111111110111 (base 2)
--------------------------------
-9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)


64 >> 1 // 32


## 无符号右移

      9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)


      -9 (base 10): 11111111111111111111111111110111 (base 2)
--------------------------------
-9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)


function isPos(n) {
return (n === (n >>> 0)) ? true : false;
}

isPos(-1); // false
isPos(1); // true


# Javascript进制转换

## toString

toString 常用于将一个变量转为字符串，或是判断一个变量的类型，例如：

let arr = []
Object.prototype.toString.call(arr) // [object Array]


(18).toString(2)  // 10010（base 2）
(18).toString(8)  // 22 （base 8）
(18).toString(16) // 12 （base 16）


## parseInt

parseInt 常用于数字取整，它同样可以传入参数用于进制转换，请看下面例子：

parseInt(10010, 2) // 18 （base 10）
parseInt(22, 8)    // 18 （base 10）
parseInt(12, 16)   // 18 （base 10）


// 问：返回的结果
[1, 2, 3].map(paseInt)


parseInt(1, 0) // 基数为 0 时，以 10 为基数进行解析，结果为 1
parseInt(2, 1) // 基数不符合 2 ~ 36 的范围，结果为 NaN
parseInt(3, 2) // 这里以 2 为基数进行解析，但 3 很明显不是一个二进制表示，故结果为 NaN

//题目结果为
[1, NaN, NaN]


# 手动实现进制转换

## 十进制转二进制

function toBinary(value) {
if (isNaN(Number(value))) {
throw \${value} is not a number
}
let bits = []
while (value >= 1) {
bits.unshift(value % 2)
value = Math.floor(value / 2)
}
return bits.join('')
}


toBinary(36) // 100100
toBinary(12) // 1100


## 二进制转十进制

function toDecimal(value) {
let bits = value.toString().split('')
let res = 0
while (bits.length) {
let bit = bits.shift()
if (bit == 1) {
// ** 为幂运算符，如：2**3 为 8
res += 2 ** bits.length
}
}
return res
}


toDecimal(10011) // 19
toDecimal(11111) // 33


# 写在最后

posted @ 2020-02-22 16:18  WahFung  阅读(323)  评论(0编辑  收藏
Live2D