返回

探索JS位运算的20种用法,提升效率和优化算法

前端

JS 位运算:释放你的编程潜能

在 JavaScript 的广阔世界中,位运算宛如一颗璀璨的明珠,散发着无穷的魅力。作为编程利器,位运算以其简洁高效的特点,在算法优化和复杂问题求解中大放异彩。让我们踏上这段探索之旅,解锁 JS 位运算的 20 种玩法,让你的编程技能飞速提升!

快速判断奇偶数:

判断数字奇偶,是程序设计中的基本操作。利用位运算,我们只需简单地使用 number & 1 即可轻松搞定。该运算将返回数字的二进制末位(0 或 1),0 表示偶数,1 表示奇数。

检测位数是否为 2 的幂次:

想要检测数字的位数是否为 2 的幂次吗?这里有一个妙招:(number & (number - 1)) === 0。如果该式子为真,则表示该数字的二进制表示中只有一位是 1,即为 2 的幂次。

二进制位反转:

二进制位反转,也称为按位取反,是位运算中的重要操作。通过 ~number,我们可以快速将数字的二进制位全部反转。例如,如果数字 5 的二进制表示为 101,反转后就变成 010,即数字 2。

获取最后一位二进制位:

需要获取数字的最后一位二进制位?直接用 number & 1 就行了!这个操作相当于对数字进行模 2 运算,结果就是该数字的末位。

检查数字是否为 3 的倍数:

想知道数字是否能被 3 整除?一个简单的位运算技巧:(number % 3) === 0。如果这个式子成立,则表明该数字是 3 的倍数。

判断数字是否为 4 的倍数:

类似于检查 3 的倍数,我们可以用 (number & 3) === 0 来判断数字是否为 4 的倍数。该式子成立时,表示该数字的二进制末两位都为 0,即为 4 的倍数。

将数字向右移动一位:

向右移动一位,相当于将数字的二进制表示右移一位,舍弃末位。用 number >>> 1 即可轻松实现。注意,>>> 是无符号右移,会将数字视为无符号整数处理。

将数字向左移动一位:

与向右移动类似,向左移动一位是将数字的二进制表示左移一位,舍弃最高位。使用 number << 1 即可完成操作。

清除数字的最低位:

要清除数字的最低位,可以使用 number & (number - 1)。这个操作等价于将数字减 1 后再进行按位与运算,从而将最低位清除为 0。

将数字的最低位设置为 1:

相反,要将数字的最低位设置为 1,可以使用 number | 1。按位或运算将确保最低位为 1,而其他位不受影响。

计算两个数字的最小公倍数:

最小公倍数 (LCM) 是两个数字的最小公倍数。利用位运算,我们可以通过公式 lcm = (a * b) / gcd 计算 LCM,其中 gcd 是两个数字的最大公约数。

计算两个数字的最大公约数:

最大公约数 (GCD) 是两个数字的最大公约数。我们可以使用辗转相除法来计算 GCD,其公式为:gcd = function (a, b) { if (b === 0) { return a; } else { return gcd(b, a % b); } };

判断数字是否为素数:

素数是指只能被 1 和自身整除的数字。我们可以使用位运算来快速判断数字是否为素数:function isPrime(n) { if (n <= 1) { return false; } for (var i = 2; i <= Math.sqrt(n); i++) { if (n % i === 0) { return false; } } return true; }

计算数字的二进制位数:

需要计算数字的二进制表示中 1 的个数吗?可以使用 function countBits(n) { var count = 0; while (n > 0) { count++; n = n >> 1; } return count; } 来实现。

判断数字是否为 2 的幂次:

想知道数字是否为 2 的幂次?我们有如下判断方法:function isPowerOfTwo(n) { return (n > 0) && ((n & (n - 1)) === 0); }。如果该式子为真,则表明该数字为 2 的幂次。

计算数字的阶乘:

阶乘是将数字乘以所有小于或等于它的正整数。我们可以使用递归来计算阶乘:function factorial(n) { if (n === 0) { return 1; } else { return n * factorial(n - 1); } }

将数字转换为二进制字符串:

需要将数字转换为二进制字符串吗?使用 function toBinaryString(n) { var binaryString = ""; while (n > 0) { binaryString = (n % 2) + binaryString; n = Math.floor(n / 2); } return binaryString; } 即可轻松实现。

将二进制字符串转换为数字:

与之对应地,将二进制字符串转换为数字可以使用 function fromBinaryString(binaryString) { var number = 0; for (var i = 0; i < binaryString.length; i++) { number += parseInt(binaryString[i]) * Math.pow(2, binaryString.length - i - 1); } return number; }

计算两个数字的异或值:

异或运算 (number1 ^ number2) 返回两个数字不同的位,相同