查看原文
其他

JavaScript巧用位操作符断奇偶

码中人 码农真经 2023-12-25

前两天翻译了一篇文章,如何找到数组里面的唯一数字,发现按位运算可以做很多事,包括可以很便捷的判断数的奇偶。

  • 原文:https://www.geeksforgeeks.org/check-if-a-number-is-odd-or-even-using-bitwise-operators/

  • 翻译:码中人

给定一个数 N,使用位运算符检查该数是偶数还是奇数。如:

输入: N = 11输出: Odd(奇数)输入: N = 14输出: Even (偶数)


方法1:按位异或


按位异或是指参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0

这个方法是用二进制数0001对数字的二进制最后一位进行处理。如果数字是偶数,数字异或之后操作会增加1,否则,数值会减少1。

所以代码如下:

看看结果 :

纳尼?怎么回事。

这里涉及运算符的优先级问题,因为相等运算符(==)的优先级比按位异或(^)要高。所以:

n ^ 1 == n + 1

相当于:

n^(1 == n+1)

即:

11为整数,为真。所以会出现11为偶数的错误。

应用分组修改优先级,正确代码应是:

function isEven(n) { if ((n ^ 1) == n + 1) { return true } else { return false }}
console.log(11, "是偶数吗?", isEven(11));console.log(14, "是偶数吗?", isEven(14));

运算符优先级 – JavaScript | MDN


方法2:按位与


按位与操作符用和号( &)表示,有两个操作数。本质上,按位与就是将两个数的每一个位对齐,然后基于真值表中的规则,对每一位执行相应的与操作。

规则为:1&1=1,1&0=0,0&1=0,0&0=0。

所以将数字与1相与,如果结果为1,即为奇数。如果为0,即为偶数。

方法3:按位或


按位或操作符用管道符( |)表示,规则为:1|1=1,1|0=1, 0|1=1 ,0|0=0。

同样将数值与1相或,得到的值如果比原来的数要大,即为偶数。数值不变即为奇数。

(完)

往期推荐

推荐四本ES6好书《深入理解ES6》《ES6标准入门》等

互联网黑话指南 【JS 实现】

JavaScript怎样查看变量所占内存的大小

区块链基础知识25讲

深入理解TypeScript(博文视点出品) [TypeScript Deep Dive]

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存