博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 位运算
阅读量:7002 次
发布时间:2019-06-27

本文共 2640 字,大约阅读时间需要 8 分钟。

主要介绍

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

简介

  • 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作
  • 按位运算就把数字转换为机器语言——二进制的数字来运算的一种运算形式

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)异或的几条性质:1、交换律  a^b = b^a2、结合律  a^b^c = a^(b^c)3、对于任何数x,都有x^x=0,x^0=x4、自反性:  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 resultshift += 7复制代码

转载地址:http://lagvl.baihongyu.com/

你可能感兴趣的文章