python 位运算

主要介绍

  1. 简介
  2. 位运算符
  3. 相关问题

简介

  • 程序中的全部数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操做 百度百科
  • 按位运算就把数字转换为机器语言——二进制的数字来运算的一种运算形式 Freewind的技术专栏

python 中的位运算符

  • 按位或预算 ( | )
    1|1=1  0|1=1  1|0=1  0|0 = 0
    即参加运算的两个对象只要有一个为1,其值为1。
    4|3= 7  (转化为二进制至关于 100 | 011  = 111 )
    复制代码
  • 按位与运算 ( & )
    1&1=1    0&1=0     0&0=0     1&0=0
    即:两位同时为“1”,结果才为“1”,不然为0    
    4&3= 0   (转化为二进制至关于 100 & 011 = 000 )
    复制代码
  • 异或运算 ( ^ )
    1^1=0     0^1=1     1^0=1     0^0=0
    即:两位相同为“0”,不一样才为“1”  
    4^3 = 7  (转化为二进制至关于 100 ^ 011 = 111)
    异或的几条性质:
    一、交换律  a^b = b^a
    二、结合律  a^b^c = a^(b^c)
    三、对于任何数x,都有x^x=0,x^0=x
    四、自反性:  a^b^b=a^0=a;
    复制代码
  • 按位翻转 ( ~ )
    将二进制数+1以后乘以-1,x的按位翻转是-(x+1)
    数字 1 在计算机中表示是由计算机字符编码决定的[1]
    utf-8,对万国码进行按类压缩,优化存放空间
    数字1:00000001,8位
    汉字:3个字节
    ~1 = ~(0000 0001) 至关于 (1111 1110) 可能我会觉得 这个数字是至关大的一个数了,可是用python解释器打印
    倒是-2 缘由是由于计算机在存储数值中有一个符号位 正数的符号位是0 负数的符号位为1 而计算机中有涉及源码 反码补码中
    咱们通常用补码表示负数,因此,对-2绝对值原码取反加1,获得1111 1101+1 = 1111 1110 反过来就是 1
    复制代码
  • 左移运算符( << )
    1 << 1 = 2  2<< 1 = 4
    左移1位后a = a *2
    复制代码
  • 右移运算符(>>)
    1 >> 1 = 0  2 >> 1 = 1
    左移1位后a = a / 2
    复制代码

相关问题

  • 进制转换
    def conver(n):
            """ 10进制转2进制 """
            if n==0:
                return 0
            temp = []
            while n:
                temp.append(n%2)
                n = n>>1
            temp.reverse()
            return "".join([str(x) for x in temp])
        def reconver(str1):
            """ 2进制转10进制 """
            temp = [int(x)for x in list(str1)]
            temp.reverse()
            sum = 0
            for i in range(0,len(temp)):
                sum += pow(2,i) * temp[i]
            return sum
    复制代码
  • 判断奇偶性
    def is_odd(n):
        if n&1 == 1:
            print("奇数")
        else:
            print("偶数")
    复制代码
  • 整数n的二进制中1的个数
    5 ( 101 )
    5 & 4 (101 & 100 = 100 ) 
    4 & 3 (100 & 011 = 000)
    >>>>> 2 
    def totle_num(n):
        """ 整数n的二进制中1的个数 n&(n-1)这个式子什么做用?把n的二进制数字中最右边的1变为0 """
        count = 0
        while n:
            count+=1
            n = n&(n-1)
        print(count)
    复制代码
  • 找出那个只出现了一次的元素
    def singleNumber(nums):
        """ [0,1,2,0,1,2,3] 给定一个非空整数列表,除了某个元素只出现一次之外,其他每一个元素均出现两次。找出那个只出现了一次的元素。leetcode 136 """
        ret = 0
        for x  in nums:
            ret = ret ^x
        return ret
    复制代码
  • 没有出如今序列中的那个数
    1. 给定一个包含 0..n 中 n 个数的列表,找出 0 .. n 中没有出如今序列中的那个数。 leetcode 268
        [1,3,0] 2
        0^1^2^3^1^3^0    2
        ret = 0
        for i in range(0,n+1)
            ret ^= i
        
        for i in range(0,len(nums)):
            ret ^= nums[i]
        
        return ret
        
        2. 1-n 放在含有 n+1 个元素的列表中,只有惟一的一个元素值重复,其它均只出现一次.
           每一个列表元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间。 进阶版 leetcode 287
        [1,2,2,3] 2 
        0^1^2^3^1^2^2^3 = 2
    复制代码
  • 一种整数数据压缩存储的算法实现
    def readVarint(trans):
    result = 0 
    shift = 0 
    while True:
        x = trans.readAll(1)    // 读取下一个字符
        byte = ord(x)              // 转成整数表示
        result |= (byte & 0x7f) << shift // 将该字节去掉最高位放在已有结果的左侧
    if byte >> 7 == 0:       // 若是该字节最高位是0,结束
        return result
    shift += 7
    复制代码
相关文章
相关标签/搜索