位运算
Posted nancyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算相关的知识,希望对你有一定的参考价值。
什么是位运算?
从现代计算机中所有的数据二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算都是叫位运算,即将符号位共同参与运算的运算。
举一个简单的例子来看下CPU是如何进行计算的,比如这行代码:
int a = 35;
int b = 47;
int c = a + b;
计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加:
35: 0 0 1 0 0 0 1 1
47: 0 0 1 0 1 1 1 1
————————————————————
82: 0 1 0 1 0 0 1 0
所以,相比在代码中直接使用(+、-、*、/)运算符,合理的运用位运算更能显著提高代码在机器上的执行效率。
常用位运算符号
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
汉明距离相关
LEECODE191 位1的个数(汉明重量)
提示 :n & (n - 1)可以消去n的二进制表示中最后一个1,所以经过多少次消去之后n变为0即n中有多少个1
时间复杂度为1的个数
0&0=0 0&1=0 1&0=0 1&1=1
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1‘。
class Solution: def hammingWeight(self, n: int) -> int: count = 0 while n !=0: n = n & (n-1) count +=1 return count
LEECODE191 汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
提示:两个数一起异或,获得异或值,相异为1,那么这个异或值上二进制位等于1的地方都是原来两个数二进制位上不相等的那些位置,统计1的个数,就能知道有哪些位数不相等了。
0^0=0 0^1=1 1^0=1 1^1=0
class Solution: def hammingDistance(self, x: int, y: int) -> int: a = x ^ y count = 0 while a != 0: a = a & (a - 1) count += 1 return count
LEECODE136 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 2:
输入: [4,1,2,1,2]
输出: 4
提示:异或的规律
-
任何数和本身异或则为
0
-
任何数和 0 异或是
本身
异或运算满足交换律和结合律。
class Solution: def singleNumber(self, nums: List[int]) -> int: res = 0 for i in nums: res = res ^ i return res
LEECODE477 汉明距离总和
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。
计算一个数组中,任意两个数之间汉明距离的总和。
示例:
输入: 4, 14, 2
输出: 6
解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)
所以答案为:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
提示:就是求这些数字的32位下的2进制,每位上有多少个1
和0,一个整数4个字节,1个字节8位。
class Solution: def totalHammingDistance(self, nums: List[int]) -> int: sum = 0 for i in range(32): count_0 = 0 count_1 = 0 for j in range(len(nums)): if (nums[j]>>i) & 1 is not 0: count_1 += 1 else: count_0 += 1 sum += count_0 * count_1 return sum
以上是关于位运算的主要内容,如果未能解决你的问题,请参考以下文章