按位运算符

185 阅读2分钟

按位运算符

将数字转化为二进制,进行位运算比较

位指的是二进制的每一位,每一位进行位运算比较

对0和1进行操作

数字和二进制互转

var num = 10
num = num.toString(2) // 将10进制转换成2进制
'1010'

parseInt(num, 2) // 将2进制转换成10进制
function numberToBinary (num) {
    var result = [];

    if (num < 0) {
        return num;
    }

    // 使用 do while 解决 num 等于 0 的情况
    do {
        var temp = num % 2;
        temp == 0 ? result.push('0') : result.push('1');
        num = Math.floor(num / 2);
    } while(num != 0);

    // 反转数组
    result.reverse();

    return result.join('');
}

按位语法

按位与 &  有00,无01,一假则假
按位或 |  有11,无10,一真则真

按位异或 ^ 相同位为0,不同位为1,生成新的二级制,转十进制

按位取反 ~
正数取反 +1 取反
负数取反 -1 取反

左移运算 << 二进制向右补n个0, num * 2^n次
右移运算 >> 二进制向左补n个0Math.floor(num / z^n)

按位与&

有0则0,无0则1,一假则假

1 & 2 = 0

// 1 = 0000 0001
// 2 = 0000 0010
	0000 0001
	0000 0010
-------------------
	0000 0000
parseInt(00000000, 2)

按位或|

有1则1,无1则0,一真则真

1 | 2 = 3
// 1 = 0000 0001
// 2 = 0000 0010
	0000 0001
	0000 0010
-------------------
	0000 0011
parseInt(00000011, 2)

按位异或

相同位为0,不同位为1,生成新的二级制,转十进制

1 ^ 2 = 3
// 1 = 0000 0001
// 2 = 0000 0010
	0000 0001
	0000 0010
-------------------
	0000 0011
parseInt(00000011, 2)

按位取反~

正数取反 +1 取反

负数取反 -1 取反

正数
~1 = -2
-(1 + 1)

负数

~-3 = 4
-(-3 - 1)

移位运算

左移运算 << 二进制向右补n个0, num * 2^n次

右移运算 >> 二进制向左补n个0, Math.floor(num / 2^n)

左移位
1 << 2
1 * 2^2 = 4
// 1 = 0000 0001
       0000 0001 00

parseInt(0000100, 2)
右移位
1 >> 2
Math.floor(1 / 2^2) = 0
// 1 = 0000 0001
       0000 0000 01

parseInt(0000000, 2)

作用

  • 运算效率高
  • 逼格

实战

奇偶判断

function oddOrEven(num) {
    // 0 偶数 1 奇数
    return num & 1
}

取整数

Math.floor(15.333)

~~15.2222
15

~15 = -14
~-14 = 15