python位运算
什么是位运算
位运算就是把数字当成二进制来进行计算,位运算有六种:&(与), |(或), ^(异或), ~(非), <<(左移), >>(右移)
&(与)
&运算规则:两个位都为1,结果为1,否则为0
# &(与)
a = 3
b = 9
print(a & b)
# a----0101
# b----1001
# a&b--0001
# a&b=1
## |(或)
|运算规则:两个位至少有一个为1,结果为1,否则为0
```python
# |(或)
a = 3
b = 9
print(a | b)
a----0101
b----1001
a|b--1101
a|b=11
<br>
## ^(异或)
^运算规则:两个位不同,结果为1,否则为0
```python
# ^(异或)
a = 3
b = 9
print(a ^ b)
# a----0101
# b----1001
# a^b--1100
# a^b=10
## ~(非)
~运算规则:对所有位取反,1变成0,0变成1
```python
a = 5
print(~a)
猜猜结果是多少?是不是以为是2,哈哈哈
看一下打印结果
```python
-6
what? 检查下计算过程
# a----101
# ~a--010
# ~a=2
按照运算规则,没错啊
这是为什么呢?其实,计算机中是以补码的形式来进行计算的
对于正数:
原码=反码=补码
对于负数:
反码=原码的符号位不变,其余位取反;
补码=反码+1
使用sys.getsizeof可以查看对象在内存空间占用的大小
import sys
a = 5
print(sys.getsizeof(a)) # 28
说明a在内存中占的位数是28
现在我们来一步一步等推算~a
a的二进制形式
0000 00000000 00000000 00000101
由于运算是以补码的形式进行,因此要将原码转化成补码,由于a为整数,因此其补码就等于原码
```python
# a的补码
0000 00000000 00000000 00000101
<br>
对a的补码进行~运算,结果为
```python
# 结果的补码
1111 11111111 11111111 11111010
到这里要注意了,计算机运算的时候是以补码的形式,但是显示到终端上还是以原码的形式,因此我们要把结果再转化回原码
由于结果为负数(符号为1),先把补码转化成反码,反码=补码-1
# 结果的反码
1111 11111111 11111111 11111001
再计算结果的原码
# 结果的原码
1000 00000000 00000000 00000110
再把结果的二进制转化成十进制形式,符号为1说明是负数,-(4+2)= -6,因此结果为-6
上面的计算过程只是让我们对计算机如何进行位运算有一个认识,实际上对于任意数a,~a = -(a+1),根本不用手工转化成二进制计算
## 对于整数a,a<<n等效于 a*2**n,也就是说移位运算可以替代乘法运算
<br>
## >>(右移位)
'>>'的规则:运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
```python
a = 9
print(a >> 2) # 2
对于整数a,a<<n等效于 int(a/2**n),向右移位可以代替除法运算
python位运算的更多相关文章
- python 位运算【实测】
python 位运算符为 << 左移,>> 右移 3<<2 既 3 的二进制整体向左移两位 : : 可以这么算 3*(2的2次方)= 12 11>> ...
- python位运算版的算术四则运算
#!/usr/bin/python # -*- coding: utf-8 -*- class ElementOperator: def add(self, num1, num2): # 32bits ...
- python——位运算之进制转化
>>> a=0b001100 >>> a 12 >>> b=0o001100 >>> b 576 >>> c= ...
- python位运算之计算中位数
# -*- coding: utf-8 -*- # @Time : 2018/11/23 10:49 PM # @Author : cxa # @File : 1.py # @Software: Py ...
- 剑指offer用位运算实现两个数相加,及python相关的位操作
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 代码: # -*- coding:utf-8 -*-class Solution: def Add(self ...
- 利用位运算进行a+b的计算(Java&&Python)
题目链接 需要用到的位运算操作:异或(^).与(&).右移(<<) 异或运算:又称不进位加法,a^b得到的结果为a与b相加,但是需要进位的地方不进位得到的结果 与运算:找出来a和b ...
- Python语言中的按位运算
(转)位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加 ...
- Python 进制转换、位运算
一.进制转换 编程用十进制,十进制转换为二进制.八进制.十六进制 In [135]: bin(23) Out[135]: '0b10111' In [136]: oct(23) Out[136]: ' ...
- jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
JAVA中&&和&.||和|(短路与和逻辑与.短路或和逻辑或)的区别 博客分类: 面试题目 Java.netBlog 转自 :http://blog.csdn.net/web ...
随机推荐
- nmap 常用命令
10.1.1.0/24 = 10.1.1.1-10.1.1.255 #c段扫描10.1.1.0/16 = 10.1.1.1-10.1.255.255 #b段扫描10.1.1.0/8 = ...
- HAOI2017 简要题解
「HAOI2017」新型城市化 题意 有一个 \(n\) 个点的无向图,其中只有 \(m\) 对点之间没有连边,保证这张图可以被分为至多两个团. 对于 \(m\) 对未连边的点对,判断有哪些点对满足将 ...
- 【CTSC2018】暴力写挂(边分治,虚树)
[CTSC2018]暴力写挂(边分治,虚树) 题面 UOJ BZOJ 洛谷 题解 发现第二棵树上的\(LCA\)的深度这玩意没法搞,那么枚举在第二棵树上的\(LCA\). 然后剩下的部分就是\(dep ...
- [luogu3648][bzoj3675][APIO2014]序列分割【动态规划+斜率优化】
题目大意 让你把一个数列分成k+1个部分,使分成乘积分成各个段乘积和最大. 分析 首先肯定是无法开下n \(\times\) n的数组,那么来一个小技巧:因为我们知道k的状态肯定是从k-1的状态转移过 ...
- [SCOI2014]方伯伯的OJ(线段树)
方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...
- 源码分析-AutoCloseable
AutoCloseable 该接口用于try-with-resources语法糖提供支持,用于自动关闭资源作用 类型:接口 方法:close(); 详解: close():用于自动关闭资源的时候需要进 ...
- redux源码解析-函数式编程
提到redux,会想到函数式编程.什么是函数式编程?是一种很奇妙的函数式的编程方法.你会感觉函数式编程这么简单,但是用起来却很方便很神奇. 在<functional javascript> ...
- Django(十九)Ajax全套
参考博客:http://www.cnblogs.com/wupeiqi/articles/5703697.html 提交: - Form - Ajax 一.Ajax,偷偷向后台发请求 - XMLHtt ...
- Python 的文件处理
Python提供了os.shutil.glob 等开发包处理文件 一.OS包 os包中包含了目录创建.目录删除.文件创建.执行系统命令等方法. import os remove() 删除文件 mk ...
- Luogu P2580 于是他错误的点名开始了 Trie树 字典树
字典树裸题.每次插入询问串,查询的时候拿出来直接查,信息保留在节点上. #include <bits/stdc++.h> using namespace std; char s[51]; ...