如何在JavaScript中计算两个数字的位差异?
更高效的二进制位差异计算方法
当然有更高效的方法啦!你提到的逐位对比思路虽然可行,但用位运算的技巧能让这个过程简洁又快速,尤其是处理大数的时候优势特别明显。
核心思路分两步:
第一步:用**异或(XOR)**操作标记不同位
两个数字执行异或运算a ^ b后,结果的二进制位中,只有当原两个数字对应位不同时才会是1,相同则为0。刚好对应你要找的“位差异”标记。比如你举的例子:- 1(二进制
01)和2(二进制10)异或得到3(二进制11),结果里有2个1,对应位差异数2 - 5(二进制
101)和7(二进制111)异或得到2(二进制010),结果里有1个1,对应位差异数1
- 1(二进制
第二步:统计异或结果中1的个数
这一步就是把标记出来的不同位数量统计出来,这里有几种常用方法:
方法1:循环移位统计
这是最直观的实现,逐位检查每一位是否为1:
def count_set_bits(n): count = 0 while n: count += n & 1 # 检查最右边的位是否为1 n >>= 1 # 右移一位,检查下一位 return count # 示例使用 a, b = 1, 2 xor_result = a ^ b bit_difference = count_set_bits(xor_result) print(bit_difference) # 输出2
方法2:Brian Kernighan算法(更高效)
这个算法每次会清除数字最右边的1,循环次数等于结果中1的个数,比移位统计更快:
def count_set_bits(n): count = 0 while n: n &= n - 1 # 清除最右边的1 count += 1 return count # 示例使用 a, b = 5, 7 xor_result = a ^ b bit_difference = count_set_bits(xor_result) print(bit_difference) # 输出1
方法3:语言内置函数(最简洁)
很多编程语言都提供了直接统计二进制中1的个数的内置方法,比如Python里可以一行搞定:
a, b = 1, 2 bit_difference = bin(a ^ b).count('1') print(bit_difference) # 输出2
总的来说,这种异或+统计置位的方法,比逐位对比更高效,代码也更简洁,尤其是当数字位数很多的时候,位运算的性能优势会非常明显。
内容的提问来源于stack exchange,提问作者pritesh
相关产品推荐
相关产品推荐

