位运算

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进制,每位上有多少个10,一个整数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

 


以上是关于位运算的主要内容,如果未能解决你的问题,请参考以下文章

编程思想:巧用位运算重构代码

基础位运算基本原理和应用

位运算相关

优雅代码05-从hashMap源码介绍位运算符

c语言位运算问题?

为啥 JSHint 反对位运算符?我应该如何表达这个代码?