本文共 2640 字,大约阅读时间需要 8 分钟。
主要介绍
- 简介
- 位运算符
- 相关问题
简介
- 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作
- 按位运算就把数字转换为机器语言——二进制的数字来运算的一种运算形式
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复制代码
转载地址:http://lagvl.baihongyu.com/